PHP防止跨站表單提交與同站跨頁僞造表單的攻擊



在以前的防止跨站攻擊的時候,使用了驗證提交的頁面是否是同一個站點,這樣可以防止普通的攻擊,ereg("www.rczjp.com",$_SERVER['HTTP_REFERER'])
不過也不是很安全的,因爲攻擊者可以僞造HTTP Referer,如 header("Referer: www.rczjp.cn"); 或者在惡意腳本中僞造HTTP頭
由於HTTP Referer是由客戶端瀏覽器發送的,而不是由服務器控制的,因此你不應當將該變量作爲一個信任源。

ASP與PHP仿跨站提交
http://www.rczjp.cn/HTML/110602/20115102085115.html

當然登錄的時候可以使用驗證碼來解決,不過其他很多表單提交還是不適宜。

下面給出一個防止僞造表單提交的方案,還解決了同一個站點不同頁面的非法調用!

//--------------- 代碼 -------------//
session_start();
#隨機取6位的散列值
function gen_token() {
$hash = md5(uniqid(rand(), true));
$n = rand(1, 26);
$token = substr($hash, $n, 6);
return $token;
}

function ck_form(){
if (_POST('qm_token')=='' || _SESSION('token')=='' || _POST('qm_token') != _SESSION('token')){
 exit('請勿非法提交');
 }
}
function token_input(){
$token = gen_token();
$_SESSION['token']= $token;
echo "<input type='hidden' name='qm_token' value='$token'/>";
}

//使用方法,注意先後順序
if(_POST('add')!=''){
 #提交表單的時候驗證提交頁面的合法性
 ck_form();
正常CODE...
}

<form name="form1" action="" method="post">
 <?php token_input();?>
其他HTML...
</form>
//------------ 代碼結束 -------------//
原理:當不同的頁面跨站或同站非法跨頁提交表單的時候
跨站時獲取的隱藏域和SESSION值都爲空,可以判斷是非法提交,因爲合法頁面的SESSION和隱藏域我賦了同樣的散列值。
同站時SESSION值和POST得到的隱藏域的值不會相同,所以也可以判斷是非法提交。


NOTE:
function _POST($str){
    $val = !empty($_POST[$str]) ? $_POST[$str] : null;
    return $val;
}
function _GET($str){
    $val = !empty($_GET[$str]) ? $_GET[$str] : null;
    return $val;
}

function _SESSION($str){
    $val = !empty($_SESSION[$str]) ? $_SESSION[$str] : null;
    return $val;
}

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