用户名:
密 码: 记住
您当前的位置:首页 > 网络编程 > php教程

PHP 过滤表单提交特殊字符

时间:2015-01-23  来源:西部数据  作者:西部数据

本文章来给大家总结一下在php中常用的一些防php注入,sql注入的一些方法介绍,在php中提供了htmlspecialchars/addslashes/stripslashes/strip_tags/mysql_real_escape_string等几个函数,有需要了解的朋友可参考.

下面针对常用表单特殊字符处理进行总结,测试字符串,代码如下:

  1. $dbstr='D:test 
  2. <a href="http://www.phpfensi.com">http://www.phpfensi.com</a>,php粉丝网 
  3. '!='1' OR '1' 
  4. </DIV> 
  5. <script  language="javascript" type="text/javascript">alert("Fail");</script> 
  6. <?php echo "<br/>PHP OUTPUT"; ?>'; 
  7. //测试代码:  
  8.  header("Content-Type: text/html; charset=UTF-8"); 
  9. echo "------------------------------------------------------<br/>rn"
  10. echo  $dbstr."<br/>rn------------------------------------------------------<br/>rn"
  11. $str=fnAddSlashes($_POST['dd']); 
  12. echo $str."<br/>rn------------------------------------------------------<br/>rn"
  13.  
  14. $str = preg_replace("/s(?=s)/","\1",$str);//多个连续空格只保留一个 
  15. $str = str_replace("r","<br/>",$str); 
  16. $str = str_replace("n","<br/>",$str); 
  17. $str = preg_replace("/((<br/?>)+)/i""<br/>"$str);//多个连续<br/>标签只保留一个 
  18.  
  19. $str=stripslashes($str); 
  20. echo strip_tags($str)."<br/>rn------------------------------------------------------<br/>rn"
  21. echo htmlspecialchars($str)."<br/>rn------------------------------------------------------<br/>rn"
  22. echo htmlentities($str)."<br/>rn------------------------------------------------------<br/>rn"
  23. echo mysql_escape_string($str)."<br/>rn------------------------------------------------------<br/>rn"

字符串包含:反斜杠路径,单双引号,HTML标记、链接、未封堵的HTML标记,数据库语法容错,JS执行判断,PHP执行判断,多个连续回车换行符和空格,其中有些概念有包含关系.

二、表单提交数据处理

1、强制加入反斜线

由于有些主机默认开启魔术引用get_magic_quotes_gpc,有些可能关闭,所以在程序上最好一律强制加入反斜线,这样可以统一处理,字符涉及单引号、双引号和反斜线,代码如下:

  1. function fnAddSlashes($data
  2.     if(!get_magic_quotes_gpc()) //只对POST/GET/cookie过来的数据增加转义 
  3.         return is_array($data)?array_map('addslashes',$data):addslashes($data); 
  4.     else 
  5.         return $data

2、对特殊字符处理

以下是几个常用字符串处理,可以视具体情况取舍。由于上面已经对提交表单数据进行一次转义,所以如果需要对内容替换或过滤需要考虑addslashes对相关字符的影响,替换或查找时需考虑反斜杠的添加。其它字符替换不影响,比如rn替换。

A、多个连续空格只保留一个,代码如下:

$data = preg_replace("/s(?=s)/","\1",$data );//多个连续空格只保留一个

B、回车换行替换成<br/>,代码如下:

$data = str_replace("r","<br/>",$data );

$data = str_replace("n","<br/>",$data ); 

html中默认<br>没封堵,xhtml中<br/>有封堵,建议使用<br/>.

C、多个连续<br/>只保留一个,代码如下:

$data = preg_replace("/((<br/?>)+)/i", "<br/>", $data );//多个连续<br/>标签只保留一个

D、全部过滤HTML标记

该方式是全部过滤潜在危险的标记,包括HTML、链接、未封堵HTML标记、JS、PHP.

使用函数strip_tags($data)

该函数使用后会过滤全部的HTML标记(包括链接)和PHP标记、JS代码等,其中链接会保留链接原文只是去除<a>标记和href部分内容,PHP标记和JS标记则会整体去除,包括中间的内容.

E、不过滤标记,只是把他们HTML化

该方法是把原提交内容全部按照普通文本来处理,使用函数htmlspecialchars($data),该函数执行后会把提交数据全部按照普通文本来展示.

使用htmlentities函数执行结果,中文显示乱码.

三、写入数据库

由于使用addslashes($data)后对于高级的可信任用户可以直接写入数据库,但是addslashes无法拦截使用0xbf27代替的单引号,所以最好还是使用mysql_real_escape_string或mysql_escape_string进行转义,不过转义之前需先去除反斜杠,假设已默认开启addslashes,代码如下:

  1. function fnEscapeStr($data
  2.  
  3.  
  4. if (get_magic_quotes_gpc()) 
  5.         $datastripslashes($value); 
  6. $data="'". mysql_escape_string($value) ."'"
  7. return $data
  8.  
  9. $data=fnEscapeStr($data); 

PHP通用防注入安全代码,代码如下:

说明:判断传递的变量中是否含有非法字符,如$_POST、$_GET

功能:防注入

  1. <?php 
  2. **************************/ 
  3. //要过滤的非法字符 
  4. $ArrFiltrate=array(”‘”,”;”,”union”); 
  5. //出错后要跳转的url,不填则默认前一页 
  6. $StrGoUrl=”"; 
  7. //是否存在数组中的值 
  8. function FunStringExist($StrFiltrate,$ArrFiltrate){ 
  9. foreach ($ArrFiltrate as $key=>$value){ 
  10. if (eregi($value,$StrFiltrate)){ 
  11. return true
  12. }//开源代码phpfensi.com 
  13. return false
  14. //合并$_POST 和 $_GET 
  15. if(function_exists(array_merge)){ 
  16. $ArrPostAndGet=array_merge($HTTP_POST_VARS,$HTTP_GET_VARS); 
  17. }else
  18. foreach($HTTP_POST_VARS as $key=>$value){ 
  19. $ArrPostAndGet[]=$value; 
  20. foreach($HTTP_GET_VARS as $key=>$value){ 
  21. $ArrPostAndGet[]=$value; 
  22. //验证开始 
  23. foreach($ArrPostAndGet as $key=>$value){ 
  24. if (FunStringExist($value,$ArrFiltrate)){ 
  25. echo “alert(/”Neeao提示,非法字符/”);”; 
  26. if (empty($StrGoUrl)){ 
  27. echo “history.go(-1);”; 
  28. }else
  29. echo “window.location=/”".$StrGoUrl.”/”;”; 
  30. exit; 
  31. ?> 

保存为checkpostandget.php,然后在每个php文件前加include(“checkpostandget.php“);即可.

来顶一下
返回首页
返回首页
推荐资讯
WiFi太不安全:7岁女孩11分钟内入侵公共网络 WiFi太不安全:7岁女孩11分钟内入侵近期刚刚发布研究说WiFi网络能获得人们手机里多少私人信息,
不服跑个分?人工智能也出现“刷分”乱象 不服跑个分?人工智能也出现“刷分2014年,人工智能领域突然爆发,成为了科研和科技创业的热门
相关文章
栏目更新
栏目热门