防范網站二次循環漏洞的示例:
PHP對MySQL的操作簡單產生二次漏洞的防范方案,用str_replace()函數依次對必要的特殊字符進行替換,代碼如下:
<?php/*
* 二次漏洞簡單檢測
*/
/*
* 鏈接數據庫(根據情況自己修改)
*/
$Host = 'localhost';
$User = 'root';
$Pass = 'password';
$DB = 'test'; //測試庫名
$db = @mysql_connect($Host,$User,$Pass);
if(!$db) die("連接服務器MySQL出錯!");
else if(!mysql_select_db($DB,$db)) die("連接數據庫出錯!");
define(INPUT_MAX_LENGTH, 10); //前臺maxlength值(初步檢測)
define(INDB_MAX_LENGTH, 20); //數據庫中字段設置的大小值(用于寫入前的必要安全測試)
/*
* 原始數據(如用戶輸入等)
*/
$string = "’//"; //用戶輸入內容
if(strlen($string) > INPUT_MAX_LENGTH) //初步檢測
die("輸入內容超長");
echo "輸入的內容:".$string;
/*
* 過濾方案
*/
//$string_in1 = AddSlashes($string); //方案一:臨時失去危險,但有二次漏洞
$string_in1 = str_slashes($string); //方案二:永久性失去危險!(自定義函數)
/*
* 安全測試
*/
$string_in2 = test_db($string_in1, 1); //一次漏洞檢測
$string_in3 = test_db($string_in2, 2); //二次漏洞檢測
/*
* 數據庫操作(函數)
*/
function test_db($str_in, $time)
{
echo "第 $time 次要寫入的內容:".$str_in;
if(strlen($str_in) > INDB_MAX_LENGTH) die("第 $time 次寫入數據超長!");//必要安全測試!
$result = mysql_query("INSERT INTO str(str) VALUES('$str_in')"); //寫入
if(!$result)
{
die("<font color=red>第 $time 次寫入數據庫失敗</font>");
}
echo "第 $time 次寫入完畢";
$result = mysql_query("SELECT str FROM str ORDER BY id DESC LIMIT 1");//取出
if($item = mysql_fetch_array($result))
{
$str_out = $item['str'];
}
echo "第 $time 次輸出:".$str_out."";
return $str_out;
}
/*
* 永久性過濾危險字符
*/
function str_slashes($str)
{
$str = str_replace("'","'",$str); //轉譯 '
$str = str_replace("//","/",$str); //轉譯 /
return $str;
}
?>