当前位置:首页 >> 网络通讯 >> 网络安全 >> 内容

PHP过滤用户提交信息(防SQL注入)

时间:2013/4/19 12:09:00 作者:平凡之路 来源:xuhantao.com 浏览:

请求层面的过滤
在request 层面 我们可能要做的是如何防止非法html 的标签的提交, 例如<script><iframe><html>等。在这里 我们可以用一个php 函数htmlspecialchars  () 这样的话前台提交的所有内容 如果包含html 标签的话 就会被转义,并且在输出的时候  这些标签会直接显示在浏览器里边 而不会被当做script被浏览器所执行。
 
SQL层面的控制
–什么是SQL注入
如果用户传入的参数 需要用于构造sql 语句的话 那么我们就需要对输入的参数进行再一次过滤, 来达到防止sql注入的目的。首先让我们来看看什么叫做sql注入,下边有这么一个例子:
 
 
在php 中我们往往会这样去构造一个sql语句
$sql = “select * from user where name = ‘” + $_GET['name']  + “‘”;
在浏览器的url里, 我们会这样去传入这个name值:
 
1.?name=rocky
第一种情况貌似一切正常, 我们成功获取了名字为rocky的用户。
 
2.?name=rocky’%20or%201=’1   (%20 表示空格)
这时候php 中得$sql变量取值就成了:
select * from user where name = ‘rocky’or 1=’1′
我们再来看看搜索出来结果, 全部的用户都被返回了, 这当然不是我们所预期的, 也就是说 我们通过传入参数来达到了改变sql语句的目的
 
3. /abc.php?name=rocky’;delete from user where 1=’1   (%20 表示空格)
这种情况貌似更糟糕,这时候的$sql变量成了:
select * from user where name = ‘rocky’;delete from user where 1=’1′
所有的用户都被删除了。
 
–如何防范SQL注入
那么我们要如何来防止这样的情况呢, 下边我以zend framework防注入的原理来谈一种解决方案:
 
1. 首先我们需要对用于实现sql注入的关键字进行一次过滤, 这里的关键字有’ ” 和; 在这些符号前加上/, zend 的实现是这样的addcslashes($value, “\000\n\r\\’\”\032″);
 
2. 其次, 在用户传入的参数到达sql之前, 我们需要明白我们期待的用户传入是个什么类型的值,www.xuhantao.com, 字符串or整数or浮点
如果是字符串的话 我们就在首位加上’ 符号  例如 ‘$var’.
如果是整形数字的话,涛涛电脑知识网, 我们则  intval( $var );
如果是浮点型的话, 我们则    sprintf(‘%F’, $var);
这样的话我们就可以过滤用户的一些非法输入
 
具体实现:
 
function quote( $value , $type ){
       if( $type == "integer" ){
              return intval( $value );
       }elseif( $type == "float" ){
              return sprintf('%F', $value );
       }else{
              return "'" . addcslashes($value, "\000\n\r\\'\"\032") ."'"
       }
 
}
 
$sql = "select * from user where name = ?";
str_replace( "?" , quote( $value , "String" ) , $sql );

相关文章
  • 没有相关文章
  • 徐汉涛(www.xuhantao.com) © 2024 版权所有 All Rights Reserved.
  • 部分内容来自网络,如有侵权请联系站长尽快处理 站长QQ:965898558(广告及站内业务受理) 网站备案号:蒙ICP备15000590号-1