本文章來給大家總結一下在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 );//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通用防注入安全代碼
代碼如下 復制代碼 說明:/*************************
保存為checkpostandget.php
然後在每個php文件前加include(“checkpostandget.php“);即可