程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP 過濾表單提交特殊字符(防注入)

PHP 過濾表單提交特殊字符(防注入)

編輯:關於PHP編程

本文章來給大家總結一下在php中常用的一些防php注入,sql注入的一些方法介紹,在php中提供了htmlspecialchars/addslashes/stripslashes/strip_tags/mysql_real_escape_string等幾個函數,有需要了解的朋友可參考。

下面針對常用表單特殊字符處理進行總結:

測試字符串:

 代碼如下 復制代碼

$dbstr='D:test
<a href="http://www.bKjia.c0m">http://www.bKjia.c0m</a>,天緣博客
'!='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
功能:
防注入
**************************/
//要過濾的非法字符
$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“);即可

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved