php怎么阻止数据异常 php curl防止阻塞( 七 )


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|'|
function verify_id($id=null)
{
if (!$id) { exit('没有提交参数!'); } // 是否为空判断
elseif (inject_check($id)) { exit('提交的参数非法!'); } // 注射判断
elseif (!is_numeric($id)) { exit('提交的参数非法!'); } // 数字判断
$id = intval($id); // 整型化
return $id;
}
?
呵呵,那么我们就能够进行校验了,于是我们上面的程序代码就变成了下面的:
PHP代码
?php
if (inject_check($_GET['id']))
{
exit('你提交的数据非法,请检查后重新提交!');
}
else
{
$id = verify_id($_GET['id']); // 这里引用了我们的过滤函数,对$id进行过滤
echo '提交的数据合法,请继续!';
}
?
好,问题到这里似乎都解决了,但是我们有没有考虑过post提交的数据,大批量的数据呢?
比如一些字符可能会对数据库造成危害,比如 ' _ ', ' %',这些字符都有特殊意义,那么我们如果进行控制呢?还有一点,就是当我们的php.ini里面的magic_quotes_gpc = off的时候,那么提交的不符合数据库规则的数据都是不会自动在前面加' '的,那么我们要控制这些问题,于是构建如下函数:

推荐阅读