您好,欢迎访问一九零五行业门户网

PHP对表单提交特殊字符的过滤和处理_PHP教程

前天天缘把博客文章做过一次内容批量修改,由于在源程序存在bug,导致很多路径或代码中的反斜杠被无辜去除,昨天通过bankw3000网友的留言才发现这个问题,已做了部分修正不排除还有些路径存在问题,如果大家发现博客上存在路径丢失反斜杠\的问题,欢迎留言反馈,天缘会再做修正。天缘本文特别把php关于表单提交特殊字符的处理方法做个汇总,主要涉及htmlspecialchars/addslashes/stripslashes/strip_tags/mysql_real_escape_string等几个函数联合使用,与大家共同交流。
一、几个与特殊字符处理有关的php函数
函数名
 释义
 介绍
htmlspecialchars
将与、单双引号、大于和小于号化成html格式
&转成& 
转成
' 转成'
htmlentities()
所有字符都转成html格式
除上面htmlspecialchars字符外,还包括双字节字符显示成编码等。
addslashes
单双引号、反斜线及null加上反斜线转义
被改的字符包括单引号(')、双引号()、反斜线backslash (\) 以及空字符null。
stripslashes
去掉反斜线字符
去掉字符串中的反斜线字符。若是连续二个反斜线,则去掉一个,留下一个。若只有一个反斜线,就直接去掉。
quotemeta
加入引用符号
将字符串中含有. \\ + * ? [ ^ ] ( $ ) 等字符的前面加入反斜线\ 符号。
nl2br()
将换行字符转成
strip_tags
去掉html及php标记
去掉字符串中任何html标记和php标记,包括标记封堵之间的内容。注意如果字符串html及php标签存在错误,也会返回错误。
mysql_real_escape_string
转义sql字符串中的特殊字符
转义\x00  \n  \r  空格  \  '  \x1a,针对多字节字符处理很有效。mysql_real_escape_string会判断字符集,mysql_escape_string则不用考虑。
其它字符串处理函数,请参考:php常用字符串正则替换及 剖分函数比较。
下面针对常用表单特殊字符处理进行总结:
测试字符串:
1 $dbstr='d:\test
2 http://www.metsky.com,天缘博客
3 \'!=\'1\' or \'1\'




8 ';
测试代码:
01 header(content-type: text/html; charset=utf-8);
02 echo ------------------------------------------------------
\r\n;
03 echo  $dbstr.
\r\n------------------------------------------------------
\r\n;
04 $str=fnaddslashes($_post['dd']);
05 echo $str.
\r\n------------------------------------------------------
\r\n;
06 
07 $str = preg_replace(/\s(?=\s)/,\\1,$str);//多个连续空格只保留一个
08 $str = str_replace(\r,
,$str);
09 $str = str_replace(\n,
,$str);
10 $str = preg_replace(/((
)+)/i,
, $str);//多个连续
标签只保留一个
11 
12 $str=stripslashes($str);
13 echo strip_tags($str).
\r\n------------------------------------------------------
\r\n;
14 echo htmlspecialchars($str).
\r\n------------------------------------------------------
\r\n;
15 echo htmlentities($str).
\r\n------------------------------------------------------
\r\n;
16 echo mysql_escape_string($str).
\r\n------------------------------------------------------
\r\n;
字符串包含:反斜杠路径,单双引号,html标记、链接、未封堵的html标记,数据库语法容错,js执行判断,php执行判断,多个连续回车换行符和空格。其中有些概念有包含关系,下同。
源码输出如下(会执行js脚本):
二、表单提交数据处理
1、强制加入反斜线
由于有些主机默认开启魔术引用get_magic_quotes_gpc,有些可能关闭,所以在程序上最好一律强制加入反斜线,这样可以统一处理,字符涉及单引号、双引号和反斜线。
1 function fnaddslashes($data)
2 {
3     if(!get_magic_quotes_gpc()) //只对post/get/cookie过来的数据增加转义
4         return is_array($data)?array_map('addslashes',$data):addslashes($data);
5     else
6         return $data;
7 }
使用函数fnaddslashes($data);结果如下图(不会执行js脚本,但html、js和php标记仍需容错处理):
使用stripslashes、换行替换、空格替换后结果如下图:
2、对特殊字符处理
以下是几个常用字符串处理,可以视具体情况取舍。由于上面已经对提交表单数据进行一次转义,所以如果需要对内容替换或过滤需要考虑addslashes对相关字符的影响,替换或查找时需考虑反斜杠的添加。其它字符替换不影响,比如\r\n替换。
a、多个连续空格只保留一个
$data = preg_replace(/\s(?=\s)/,\\1,$data );//多个连续空格只保留一个
b、回车换行替换成
$data = str_replace(\r,
,$data );
$data = str_replace(\n,
,$data );
//html中默认
没封堵,xhtml中
有封堵,建议使用
,更多区别:http://stackoverflow.com/questions/1946426/html-5-is-it-br-br-or-br
c、多个连续
只保留一个
$data = preg_replace(/((
)+)/i,
, $data );//多个连续
标签只保留一个
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)。
01 function fnescapestr($data)
02 
03 {
04 
05 if (get_magic_quotes_gpc())
06 {
07         $data= stripslashes($value);
08 }
09 $data='. mysql_escape_string($value) .';
10 return $data;
11 }
12 
13 $data=fnescapestr($data);
执行后如下图:
四、提交后的即时显示
1、如果上文使用了addslashes,则必须在把数据回显之前去除反斜线
使用函数stripslashes($data)
注意这个函 数只是面向被addslashes($data)处理后的数据,要谨慎使用,否则会导致反斜线丢失(比如内容的文件夹路径分割线、驱动器路径等),天缘前 几天出现的错误就是因为在数据库读取时使用了这个函数(代码是老代码,忘记修改了)导致再次写入数据库导致很多路径中的反斜杠丢失,要不也没有本文了。
2、使用函数htmlspecialchars($data),该函数执行后会把提交数据全部按照文本来展示,除非允许链接等需特殊处理外,可以一 律使用 htmlspecialchars输出,尤其是对于未封堵的html标记,如果既没有过滤再不采用标记转换,那么输出后可能会导致版面混乱。
htmlentities则不建议使用,一方面对输出的源码造成很大的阅读障碍,再者使用htmlentities函数会造成双字节字符比如中文会显示一堆乱码。其它字符显示还算正常。
第二种输出方法,视情况需要,如果确认没有非法标记或潜在的执行风险,可以直接输出。
http://www.bkjia.com/phpjc/478662.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/478662.htmltecharticle前天天缘把博客文章做过一次内容批量修改,由于在源程序存在bug,导致很多路径或代码中的反斜杠被无辜去除,昨天通过bankw3000网友的留...
其它类似信息

推荐信息