PHP加了Token驗證表單防止CSRF後還有必要做其它的防範嗎?

PHP加了Token驗證表單防止CSRF後還有必要做其它的防範嗎?比如判斷REFERER,再加個驗證碼之類的?有沒有這個必要,目前再寫一個模板做練習,已經加上了Token驗證,準備再加上判斷REFERER時突然覺得這樣會不會有點多此一舉?或則有什麼其它更好的方法嗎?

目前的代碼是這樣的,先判斷來源,再判斷Token

//判斷請求-登陸
if($_GET["login"]=="action"){
//判斷REFERER
$referer = $_SERVER["HTTP_REFERER"]; //獲取前一頁面的 URL 地址
$url = $_SERVER["HTTP_HOST"]; //獲取本頁面的主機 URL 地址
//echo "來源頁面:$referer & 本地頁面:$url &"; //輸出結果(測試用)
if(preg_match("|$url|", $referer)){
//來源通過,判斷Token令牌
session_start();
if($_POST["token"] == $_SESSION["token"]){
unset($_SESSION["token"]);
echo "這是一個正常的提交請求";
}else{
echo "這是一個非法的提交請求";
}
}else{
echo "非法來源的請求";
}
}


來源請求頭Referer可以偽造,所以不能替代CSRF驗證.

驗證碼跟CSRF Token防禦的攻擊不一樣.驗證碼主要是用於鑒別人類和機器(程序),而CSRF Token主要是用來防禦跨站請求偽造(如誘導用戶點擊鏈接修改數據).

可以這麼說,CSRF Token是表單驗證必備的,而驗證碼是可選的.剩下的就是跟業務相關的具體數據的驗證,比如用戶註冊時對用戶名和密碼的格式和組成的驗證.

驗證碼則包括圖片驗證碼,郵件驗證碼,簡訊驗證碼,視情況使用.比如登錄時一般會用到圖片驗證碼,而註冊時會用到郵件或簡訊驗證碼.


有些答主連csrf都沒搞清楚就強行裝逼


現在的網路環境確實比較變態。

referer驗證無意義,可以偽造。

你的token本身應該有一套驗證機制,比如可以通過token確認用戶身份,並且A用戶獲得B的token你也可以分辨,否則也沒有意義。

比如在用戶登錄/註冊的時候,需要驗證難度較高的驗證碼/手機短消息。否則也沒有意義。現在淘寶還可以買手機短消息,比如3毛一條,批量跟你搞。。只要你的平台有商業做廣告價值,他們就會不停的跟你搞下去,在這個過程中,技術的提升還是很明顯的。

表單本身就是公開給用戶的,所以做好用戶身份確認表單內容每項驗證才是關鍵。


我看阿里egg框架也就加了token驗證,畢竟加了token其實已經比較安全了,referer因為可以偽造,所以對於referer進行白名單其實沒什麼卵用。


推薦閱讀:

如何用簡潔生動的語言理清XSS和CSRF的區別?
CSRF防禦,token保存在伺服器session中,客戶端是如何獲取token?

TAG:HTML | PHP | HTML5 | XSS | CSRF |