php如何拦截数据库异常 php防止sql注入的最佳方式( 三 )


$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查询语句 , 导致重要数据被窃取、数据丢失或者损坏,或者被入侵到后台管理 。
那么我们既然了解了基本的注射入侵的方式,那么我们如何去防范呢?这个就应该我们从代码去入手了 。
我们知道Web上提交数据有两种方式,一种是get、一种是post,那么很多常见的sql注射就是从get方式入手的 , 而且注射的语句里面一定是包含一些sql语句的,因为没有sql语句,那么如何进行,sql语句有四大句:select 、update、delete、insert,那么我们如果在我们提交的数据中进行过滤是不是能够避免这些问题呢?
于是我们使用正则就构建如下函数:
PHP代码
?php
function inject_check($sql_str)
{
return eregi('select|insert|update|delete|'|

推荐阅读