php屏蔽所有错误数据库 php屏蔽所有错误数据库( 三 )


这也是当前很多虚拟主机提供商的流行配置方法哦,不过这种方法用于防止这里就显的有点大材小用了 。
【二、在PHP代码编写】
虽然国内很多PHP程序员仍在依靠addslashes防止SQL注入,还是建议大家加强中文防止SQL注入的检查 。addslashes的问题在于黑客可以用0xbf27来代替单引号,而addslashes只是将0xbf27修改为0xbf5c27,成为一个有效的多字节字符,其中的0xbf5c仍会被看作是单引号 , 所以addslashes无法成功拦截 。
当然addslashes也不是毫无用处,它是用于单字节字符串的处理,多字节字符还是用mysql_real_escape_string吧 。
另外对于php手册中get_magic_quotes_gpc的举例:
if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST[‘lastname’]);
} else {
$lastname = $_POST[‘lastname’];
}
最好对magic_quotes_gpc已经开放的情况下 , 还是对$_POST[’lastname’]进行检查一下 。
再说下mysql_real_escape_string和mysql_escape_string这2个函数的区别:
mysql_real_escape_string 必须在(PHP 4 = 4.3.0, PHP 5)的情况下才能使用 。否则只能用 mysql_escape_string,两者的区别是:mysql_real_escape_string 考虑到连接的
当前字符集 , 而mysql_escape_string 不考虑 。
总结一下:
* addslashes() 是强行加\;
* mysql_real_escape_string()会判断字符集,但是对PHP版本有要求;
* mysql_escape_string不考虑连接的当前字符集 。
-------------------------------------------------------------------------------------------------
在PHP编码的时候 , 如果考虑到一些比较基本的安全问题 , 首先一点:
1. 初始化你的变量
为什么这么说呢?我们看下面的代码:
PHP代码
?php
if ($admin)
{
echo '登陆成功!';
include('admin.php');
}
else
{
echo '你不是管理员,无法进行管理!';
}
?
好,我们看上面的代码好像是能正常运行 , 没有问题,那么加入我提交一个非法的参数过去呢,那么效果会如何呢?比如我们的这个页是,那么我们提交:,呵呵,你想一些,我们是不是直接就是管理员了 , 直接进行管理 。
当然,可能我们不会犯这么简单错的错误 , 那么一些很隐秘的错误也可能导致这个问题 , 比如phpwind论坛有个漏洞,导致能够直接拿到管理员权限,就是因为有个$skin变量没有初始化,导致了后面一系列问题 。那么我们如何避免上面的问题呢?首先,从php.ini入手,把php.ini里面的register_global =off,就是不是所有的注册变量为全局,那么就能避免了 。但是 , 我们不是服务器管理员,只能从代码上改进了,那么我们如何改进上面的代码呢?我们改写如下:
PHP代码
?php
$admin = 0; // 初始化变量
if ($_POST['admin_user']$_POST['admin_pass'])
{
// 判断提交的管理员用户名和密码是不是对的相应的处理代码
// ...
$admin = 1;
}
else
{
$admin = 0;
}
if ($admin)
{
echo '登陆成功!';
include('admin.php');
}
else
{
echo '你不是管理员 , 无法进行管理!';
}
?
那么这时候你再提交就不好使了,因为我们在一开始就把变量初始化为 $admin = 0 了 , 那么你就无法通过这个漏洞获取管理员权限 。
2. 防止SQL Injection (sql注射)
SQL 注射应该是目前程序危害最大的了,包括最早从asp到php,基本上都是国内这两年流行的技术,基本原理就是通过对提交变量的不过滤形成注入点然后使恶意用户能够提交一些sql查询语句 , 导致重要数据被窃取、数据丢失或者损坏,或者被入侵到后台管理 。

推荐阅读