PHP 防注入安全实现程序代码
以前讲述的很多关于sql防注入的代码,但是还是得从我们的服务器脚本开始了,下面就来讲述一个下php中防注入的一些常见方法大家可参考.
最常用见的可能就是:
首先将magic_quotes_gpc设置为On,display_errors设置为Off,如果id型,我们利用intval()将其转换成整数类型,如代码:$id=intval($id);
好了下面我来介绍php提交数据过滤的基本原则
1)提交变量进数据库时,我们必须使用addslashes()进行过滤,像我们的注入问题,一个addslashes()也就搞定了,其实在涉及到变量取值时,intval()函数对字符串的过滤也是个不错的选择.
2)在php.ini中开启magic_quotes_gpc和magic_quotes_runtime。magic_quotes_gpc可以把get,post,cookie里的引号变为斜杠,magic_quotes_runtime对于进出数据库的数据可以起到格式话的作用,其实,早在以前注入很疯狂时,这个参数就很流行了.
3)在使用系统函数时,必须使用escapeshellarg(),escapeshellcmd()参数去过滤,这样你也就可以放心的使用系统函数.
4)对于跨站,strip_tags(),htmlspecialchars()两个参数都不错,对于用户提交的的带有html和php的标记都将进行转换,比如尖括号"<"就将转化为 "<"这样无害的字符。
代码如下:
$new = htmlspecialchars("<a href='test'>Test</a>",ENT_QUOTES);
strip_tags($text,);
5)对于相关函数的过滤,就像先前的include(),unlink,fopen()等等,只要你把你所要执行操作的变量指定好或者对相关字符过滤严密,我想这样也就无懈可击了.
2、PHP简单的数据过滤
1)入库:trim($str),addslashes($str)
2)出库:stripslashes($str)
3)显示:htmlspecialchars(nl2br($str))
分享一个实例,具体的代码如下:
<?php //security.php /** * @author zhengwei * @copyright 2007 */ /* 函数名称:inject_check() 函数作用:检测提交的值是不是含有SQL注射的字符,防止注射,保护服务器安全 参 数:$sql_str: 提交的变量 返 回 值:返回检测结果,ture or false 函数作者:heiyeluren */ function inject_check( $sql_str ) { return eregi ( 'select|insert|update|delete|' | /*|*||./|union|into|load_file|outfile', $sql_str); // 进行过滤 } //开源代码phpfensi.com /* 函数名称:verify_id() 函数作用:校验提交的ID类值是否合法 参 数:$id: 提交的ID值 返 回 值:返回处理后的ID 函数作者:heiyeluren */ function verify_id( $id =null) { if (! $id ) { exit ( '没有提交参数!' ); } // 是否为空判断 elseif (inject_check( $id )) { exit ( '提交的参数非法!' ); } // 注射判断 elseif (! is_numeric ( $id )) { exit ( '提交的参数非法!' ); } // 数字判断 $id = intval ( $id ); // 整型化 return $id ; } /* 函数名称:str_check() 函数作用:对提交的字符串进行过滤 参 数:$var: 要处理的字符串 返 回 值:返回过滤后的字符串 函数作者:heiyeluren */ function str_check( $str ) { if (!get_magic_quotes_gpc()) { // 判断magic_quotes_gpc是否打开 $str = addslashes ( $str ); // 进行过滤 } $str = str_replace ( "_" , "_" , $str ); // 把 '_'过滤掉 $str = str_replace ( "%" , "%" , $str ); // 把 '%'过滤掉 return $str ; } /* 函数名称:post_check() 函数作用:对提交的编辑内容进行处理 参 数:$post: 要提交的内容 返 回 值:$post: 返回过滤后的内容 函数作者:heiyeluren */ function post_check( $post ) { if (!get_magic_quotes_gpc()) { // 判断magic_quotes_gpc是否为打开 $post = addslashes ( $post ); // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤 } $post = str_replace ( "_" , "_" , $post ); // 把 '_'过滤掉 $post = str_replace ( "%" , "%" , $post ); // 把 '%'过滤掉 $post = nl2br ( $post ); // 回车转换 $post = htmlspecialchars( $post ); // html标记转换 return $post ; } foreach ( $_POST as $post_key => $post_var ) { if ( is_numeric ( $post_var )) { $post [ strtolower ( $post_key )] = get_int( $post_var ); } else { $post [ strtolower ( $post_key )] = get_str( $post_var ); } } /* 过滤函数 */ //整型过滤函数 function get_int( $number ) { return intval ( $number ); } //字符串型过滤函数 function get_str( $string ) { if (!get_magic_quotes_gpc()) { return addslashes ( $string ); } return $string ; } ?>在有些cms中我会看到如下代码:
foreach ( $HTTP_POST_VARS as $key => $value ){ $ArrPostAndGet []= $value ; } foreach ( $HTTP_GET_VARS as $key => $value ){ $ArrPostAndGet []= $value ; }这个的代码然后在所有页面都加载这个函数,这样过滤个人发现好像上传文件时会有问题.
查看更多关于PHP 防注入安全实现程序代码 - php高级应用的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did30050