本文章来给大家总结一下在php中常用的一些防php注入,sql注入的一些方法介绍,在php中提供了htmlspecialchars/addslashes/stripslashes/strip_tags/mysql_real_escape_string等几个函数,有需要了解的朋友可参考。
下面针对常用表单特殊字符处理进行总结:
测试字符串:
代码如下复制代码$dbstr='D:testhttp://www.bKjia.c0m,天缘博客'!='1' OR '1'PHP OUTPUT"; ?>';
测试代码:
代码如下复制代码header("Content-Type: text/html; charset=UTF-8");echo "------------------------------------------------------rn";echo $dbstr."rn------------------------------------------------------rn";$str=fnAddSlashes($_POST['dd']);echo $str."rn------------------------------------------------------rn";$str = preg_replace("/s(?=s)/","\1",$str);//多个连续空格只保留一个$str = str_replace("r","",$str);$str = str_replace("n","",$str);$str = preg_replace("/(()+)/i", "", $str);//多个连续标签只保留一个$str=stripslashes($str);echo strip_tags($str)."rn------------------------------------------------------rn";echo htmlspecialchars($str)."rn------------------------------------------------------rn";echo htmlentities($str)."rn------------------------------------------------------rn";echo mysql_escape_string($str)."rn------------------------------------------------------rn";字符串包含:反斜杠路径,单双引号,HTML标记、链接、未封堵的HTML标记,数据库语法容错,JS执行判断,PHP执行判断,多个连续回车换行符和空格。其中有些概念有包含关系
二、表单提交数据处理
1、强制加入反斜线
由于有些主机默认开启魔术引用get_magic_quotes_gpc,有些可能关闭,所以在程序上最好一律强制加入反斜线,这样可以统一处理,字符涉及单引号、双引号和反斜线。
立即学习“PHP免费学习笔记(深入)
”;
代码如下复制代码function fnAddSlashes($data){if(!get_magic_quotes_gpc()) //只对POST/GET/cookie过来的数据增加转义return is_array($data)?array_map('addslashes',$data):addslashes($data);elsereturn $data;}
2、对特殊字符处理
以下是几个常用字符串处理,可以视具体情况取舍。由于上面已经对提交表单数据进行一次转义,所以如果需要对内容替换或过滤需要考虑addslashes对相关字符的影响,替换或查找时需考虑反斜杠的添加。其它字符替换不影响,比如rn替换。
A、多个连续空格只保留一个代码如下复制代码$data = preg_replace("/s(?=s)/","\1",$data );//多个连续空格只保留一个B、回车换行替换成代码如下复制代码$data = str_replace("r","",$data );$data = str_replace("n","",$data );//html中默认没封堵,xhtml中有封堵,建议使用
,更多区别:
C、多个连续只保留一个代码如下复制代码$data = preg_replace("/(()+)/i", "", $data );//多个连续标签只保留一个PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载D、全部过滤HTML标记该方式是全部过滤潜在危险的标记,包括HTML、链接、未封堵HTML标记、JS、PHP。
使用函数strip_tags($data)该函数使用后会过滤全部的HTML标记(包括链接)和PHP标记、JS代码等,其中链接会保留链接原文只是去除标记和href部分内容,PHP标记和JS标记则会整体去除,包括中间的内容,如下图:E、不过滤标记,只是把他们HTML化该方法是把原提交内容全部按照普通文本来处理。
使用函数htmlspecialchars($data),该函数执行后会把提交数据全部按照普通文本来展示,如下图:使用htmlentities函数执行结果(中文显示乱码):
三、写入数据库
由于使用addslashes($data)后对于高级的可信任用户可以直接写入数据库,但是addslashes无法拦截使用0xbf27代替的单引号,所以最好还是使用mysql_real_escape_string或mysql_escape_string进行转义,不过转义之前需先去除反斜杠(假设已默认开启addslashes)。
代码如下复制代码function fnEscapeStr($data){if (get_magic_quotes_gpc()){$data= stripslashes($value);}$data="'". mysql_escape_string($value) ."'";return $data;}$data=fnEscapeStr($data);PHP通用防注入安全代码代码如下复制代码说明:判断传递的变量中是否含有非法字符如$_POST、$_GET功能:防注入**************************///要过滤的非法字符$ArrFiltrate=array(”‘”,”;”,”union”);//出错后要跳转的url,不填则默认前一页$StrGoUrl=”";//是否存在数组中的值function FunStringExist($StrFiltrate,$ArrFiltrate){foreach ($ArrFiltrate as $key=>$value){if (eregi($value,$StrFiltrate)){return true;}}return false;}//合并$_POST 和 $_GETif(function_exists(array_merge)){$ArrPostAndGet=array_merge($HTTP_POST_VARS,$HTTP_GET_VARS);}else{foreach($HTTP_POST_VARS as $key=>$value){$ArrPostAndGet[]=$value;}foreach($HTTP_GET_VARS as $key=>$value){$ArrPostAndGet[]=$value;}}//验证开始foreach($ArrPostAndGet as $key=>$value){if (FunStringExist($value,$ArrFiltrate)){echo “alert(/”Neeao提示,非法字符/”);”;if (empty($StrGoUrl)){echo “history.go(-1);”;}else{echo “window.location=/”".$StrGoUrl.”/”;”;}exit;}}?>/*************************保存为checkpostandget.php然后在每个php文件前加include(“checkpostandget.php“);即可http://www.bkjia.com/PHPjc/629625.html www.bkjia.com true http://www.bkjia.com/PHPjc/629625.html TechArticle本文章来给大家总结一下在php中常用的一些防php注入,sql注入的一些方法介绍,在php中提供了htmlspecialchars/addslashes/stripslashes/strip_tags/mysql_re...
