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() |
将换行字符转成<br> |
|
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 <a href="http://www.metsky.com">http://www.metsky.com</a>,天缘博客
3 \'!=\'1\' OR \'1\'
4 </DIV>
5 <script language="javascript" type="text/javascript">alert("Fail");</script>
6
7
8 <?php echo "<br/>PHP OUTPUT"; ?>';
测试代码:
01 header("Content-Type: text/html; charset=UTF-8");
02 echo "------------------------------------------------------<br/>\r\n";
03 echo $dbstr."<br/>\r\n------------------------------------------------------<br/>\r\n";
04 $str=fnAddSlashes($_POST['dd']);
05 echo $str."<br/>\r\n------------------------------------------------------<br/>\r\n";
06
07 $str = preg_replace("/\s(?=\s)/","\\1",$str);//多个连续空格只保留一个
08 $str = str_replace("\r","<br/>",$str);
09 $str = str_replace("\n","<br/>",$str);
10 $str = preg_replace("/((<br\/?>)+)/i", "<br/>", $str);//多个连续<br/>标签只保留一个
11
12 $str=stripslashes($str);
13 echo strip_tags($str)."<br/>\r\n------------------------------------------------------<br/>\r\n";
14 echo htmlspecialchars($str)."<br/>\r\n------------------------------------------------------<br/>\r\n";
15 echo htmlentities($str)."<br/>\r\n------------------------------------------------------<br/>\r\n";
16 echo mysql_escape_string($str)."<br/>\r\n------------------------------------------------------<br/>\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、回车换行替换成<br/>
$data = str_replace("\r","<br/>",$data );
$data = str_replace("\n","<br/>",$data );
//html中默认<br>没封堵,xhtml中<br/>有封堵,建议使用<br/>,更多区别:http://stackoverflow.com/questions/1946426/html-5-is-it-br-br-or-br
C、多个连续<br/>只保留一个
$data = preg_replace("/((<br\/?>)+)/i", "<br/>", $data );//多个连续<br/>标签只保留一个
D、全部过滤HTML标记
该方式是全部过滤潜在危险的标记,包括HTML、链接、未封堵HTML标记、JS、PHP。
使用函数strip_tags($data)
该函数使用后会过滤全部的HTML标记(包括链接)和PHP标记
补充:Web开发 , php ,