网站地图    收藏   

主页 > 后端 > 网站安全 >

PHP过滤用户提交信息(防SQL注入) - 网站安全 - 自

来源:自学PHP网    时间:2015-04-17 11:59 作者: 阅读:

[导读] 请求层面的过滤在request 层面 我们可能要做的是如何防止非法html 的标签的提交, 例如scriptiframehtml等。在这里 我们可以用一个php 函数htmlspecialchars (http://www.php.net/manual/en/functio......

请求层面的过滤
在request 层面 我们可能要做的是如何防止非法html 的标签的提交, 例如<script><iframe><html>等。在这里 我们可以用一个php 函数htmlspecialchars  (http://www.php.net/manual/en/function.htmlspecialchars.php) 这样的话前台提交的所有内容 如果包含html 标签的话 就会被转义,并且在输出的时候  这些标签会直接显示在浏览器里边 而不会被当做script被浏览器所执行。
 
SQL层面的控制
–什么是SQL注入
如果用户传入的参数 需要用于构造sql 语句的话 那么我们就需要对输入的参数进行再一次过滤, 来达到防止sql注入的目的。首先让我们来看看什么叫做sql注入,下边有这么一个例子:
 
 
在php 中我们往往会这样去构造一个sql语句
$sql = “select * from user where name = ‘” + $_GET['name']  + “‘”;
在浏览器的url里, 我们会这样去传入这个name值:
 
1.HTTP://xxx.xxx.xxx/abc.php?name=rocky
第一种情况貌似一切正常, 我们成功获取了名字为rocky的用户。
 
2.HTTP://xxx.xxx.xxx/abc.php?name=rocky’%20or%201=’1   (%20 表示空格)
这时候php 中得$sql变量取值就成了:
select * from user where name = ‘rocky’or 1=’1′
我们再来看看搜索出来结果, 全部的用户都被返回了, 这当然不是我们所预期的, 也就是说 我们通过传入参数来达到了改变sql语句的目的
 
3.HTTP://www.2cto.com /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之前, 我们需要明白我们期待的用户传入是个什么类型的值, 字符串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 );

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论