来源:自学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