php過濾提交數據 防止sql注入***(8)

現在還剩下什麼問題呢?遠程表單提交。

遠程表單提交

Web 的好處是可以分享信息和服務。壞處也是可以分享信息和服務,因爲有些人做事毫無顧忌。

以 表單爲例。任何人都能夠訪問一個 Web 站點,並使用瀏覽器上的 File > Save As 建立表單的本地副本。然後,他可以修改 action 參數來指向一個完全限定的 URL(不指向 formHandler.php,而是指向 http://www.yoursite.com/formHandler.php,因爲表單在這個站點上),做他希望的任何修改,點擊 Submit,服務器會把這個表單數據作爲合法通信流接收。

首先可能考慮檢查 $_SERVER[’HTTP_REFERER’],從而判斷請求是否來自自己的服務器,這種方法可以擋住大多數惡意用戶,但是擋不住最高明的***。這些人足夠聰明,能夠篡改頭部中的引用者信息,使表單的遠程副本看起來像是從您的服務器提交的。

處理遠程表單提交更好的方式是,根據一個惟一的字符串或時間戳生成一個令牌,並將這個令牌放在會話變量和表單中。提交表單之後,檢查兩個令牌是否匹配。如果不匹配,就知道有人試圖從表單的遠程副本發送數據。

要創建隨機的令牌,可以使用 PHP 內置的 md5()、uniqid() 和 rand() 函數,如下所示:

清單 18. 防禦遠程表單提交

session_start();

if ($_POST[’submit’] == “go”){

//check token

if ($_POST[’token’] == $_SESSION[’token’]){

//strip_tags

$name = strip_tags($_POST[’name’]);

$name = substr($name,0,40);

//clean out any potential hexadecimal characters

$name = cleanHex($name);

//continue processing….

}else{

//stop all processing! remote form posting attempt!

}

}

$token = md5(uniqid(rand(), true));

$_SESSION[’token’]= $token;

function cleanHex($input){

$clean = preg_replace(”![\][xX]([A-Fa-f0-9]{1,3})!”, “”,$input);

return $clean;

}

?>

” method=”post”>

Name

”/>

這種技術是有效的,這是因爲在 PHP 中會話數據無法在服務器之間遷移。即使有人獲得了您的 PHP 源代碼,將它轉移到自己的服務器上,並向您的服務器提交信息,您的服務器接收的也只是空的或畸形的會話令牌和原來提供的表單令牌。它們不匹配,遠程表單提交就失敗了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章