PHP 过滤表单提交特殊字符
发布:smiling 来源: PHP粉丝网 添加日期:2014-08-22 15:03:57 浏览: 评论:0
本文章来给大家总结一下在php中常用的一些防php注入,sql注入的一些方法介绍,在php中提供了htmlspecialchars/addslashes/stripslashes/strip_tags/mysql_real_escape_string等几个函数,有需要了解的朋友可参考.
下面针对常用表单特殊字符处理进行总结,测试字符串,代码如下:
- $dbstr='D:test
- <a href="http://www.phpfensi.com">http://www.phpfensi.com</a>,php粉丝网
- '!='1' OR '1'
- </DIV>
- <script language="javascript" type="text/javascript">alert("Fail");</script>
- <?php echo "<br/>PHP OUTPUT"; ?>';
- //测试代码:
- header("Content-Type: text/html; charset=UTF-8");
- echo "------------------------------------------------------<br/>rn";
- echo $dbstr."<br/>rn------------------------------------------------------<br/>rn";
- $str=fnAddSlashes($_POST['dd']);
- echo $str."<br/>rn------------------------------------------------------<br/>rn";
- $str = preg_replace("/s(?=s)/","\1",$str);//多个连续空格只保留一个
- $str = str_replace("r","<br/>",$str);
- $str = str_replace("n","<br/>",$str);
- $str = preg_replace("/((<br/?>)+)/i", "<br/>", $str);//多个连续<br/>标签只保留一个
- $str=stripslashes($str);
- echo strip_tags($str)."<br/>rn------------------------------------------------------<br/>rn";
- echo htmlspecialchars($str)."<br/>rn------------------------------------------------------<br/>rn";
- echo htmlentities($str)."<br/>rn------------------------------------------------------<br/>rn";
- echo mysql_escape_string($str)."<br/>rn------------------------------------------------------<br/>rn";
字符串包含:反斜杠路径,单双引号,HTML标记、链接、未封堵的HTML标记,数据库语法容错,JS执行判断,PHP执行判断,多个连续回车换行符和空格,其中有些概念有包含关系.
二、表单提交数据处理
1、强制加入反斜线
由于有些主机默认开启魔术引用get_magic_quotes_gpc,有些可能关闭,所以在程序上最好一律强制加入反斜线,这样可以统一处理,字符涉及单引号、双引号和反斜线,代码如下:
- function fnAddSlashes($data)
- {
- if(!get_magic_quotes_gpc()) //只对POST/GET/cookie过来的数据增加转义
- return is_array($data)?array_map('addslashes',$data):addslashes($data);
- else
- 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,代码如下:
- function fnEscapeStr($data)
- {
- if (get_magic_quotes_gpc())
- {
- $data= stripslashes($value);
- }
- $data="'". mysql_escape_string($value) ."'";
- return $data;
- }
- $data=fnEscapeStr($data);
PHP通用防注入安全代码,代码如下:
说明:判断传递的变量中是否含有非法字符,如$_POST、$_GET
功能:防注入
- <?php
- **************************/
- //要过滤的非法字符
- $ArrFiltrate=array(”‘”,”;”,”union”);
- //出错后要跳转的url,不填则默认前一页
- $StrGoUrl=”";
- //是否存在数组中的值
- function FunStringExist($StrFiltrate,$ArrFiltrate){
- foreach ($ArrFiltrate as $key=>$value){
- if (eregi($value,$StrFiltrate)){
- return true;
- }//开源代码phpfensi.com
- }
- return false;
- }
- //合并$_POST 和 $_GET
- if(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“);即可.
Tags: PHP过滤表单 PHP过滤特殊字符
- 上一篇:php防止恶意刷新与刷票实现代码
- 下一篇:php防止sql注入原理介绍
相关文章
- ·Php中过滤表单提交的html标签(2015-04-13)
- ·php实现过滤表单提交中html标签的方法(2021-04-17)
- ·php过滤表单提交的html等危险代码(2021-04-21)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)