php mysql过滤特殊字符_PHP 过滤表单提交特殊字符(防注入)_PHP教程

本文详细介绍了PHP中防止SQL注入的各种方法,包括使用htmlspecialchars、addslashes、stripslashes、strip_tags和mysql_real_escape_string等函数。通过示例代码展示了如何处理表单提交的特殊字符,确保数据安全。同时,文章还提供了通用的防注入安全代码示例。
摘要由CSDN通过智能技术生成

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

下面针对常用表单特殊字符处理进行总结:

测试字符串:

代码如下

复制代码

$dbstr=’D:test

http://www.bKjia.c0m,天缘博客

‘!=’1’ OR ‘1’

alert(“Fail”);

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,有些可能关闭,所以在程序上最好一律强制加入反斜线,这样可以统一处理,字符涉及单引号、双引号和反斜线。

代码如下

复制代码

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、回车换行替换成

代码如下

复制代码

$data = str_replace(“r”,”

“,$data );

$data = str_replace(“n”,”

“,$data );

//html中默认

没封堵,xhtml中

有封堵,建议使用

,更多区别:

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)。

代码如下

复制代码

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 和 $_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“);即可

www.bkjia.comtrueTechArticle本文章来给大家总结一下在php中常用的一些防php注入,sql注入的一些方法介绍,在php中提供了htmlspecialchars/addslashes/stripslashes/strip_tags/mysql_re…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值