跨站請求偽造CSRF的防御:One-Time Tokens(不同的表單包含一個不同的偽隨機值)
在實現One-Time
Tokens時,需要注意一點:就是“并行會話的兼容”。如果用戶在一個站點上同時打開了兩個不同的表單,CSRF保護措施不應該影響到他對任何表單的提
PHP偽協議、交。考慮一下如果每次表單被裝入時站點生成一個偽隨機值來覆蓋以前的偽隨機值將會發生什么情況:用戶只能成功地提交他最后打開的表單,因為所有其他的表單
都含有非法的偽隨機值。必須小心操作以確保CSRF保護措施不會影響選項卡式的瀏覽或者利用多個瀏覽器窗口瀏覽一個站點。
以下我的實現:
1).先是令牌生成函數(gen_token()):
php防注入,function gen_token() {
//這里我是貪方便,實際上單使用Rand()得出的隨機數作為令牌,也是不安全的。
$token = md5(uniqid(rand(), true));
return $token;
sessionid防跨站?}
2).然后是Session令牌生成函數(gen_stoken()):
function gen_stoken() {
$pToken = "";
csrf跨站請求、if($_SESSION[STOKEN_NAME] == $pToken){
//沒有值,賦新值
$_SESSION[STOKEN_NAME] = gen_token();
}
php安全攻防,else{
//繼續使用舊的值
}
}
php防抓包、?>
3).WEB表單生成隱藏輸入域的函數:
function gen_input() {
gen_stoken();
怎么防御偽造協議頭?echo “
value=\”" . $_SESSION[STOKEN_NAME] . “\”> “;
}
?>
php靜態整站劫持代碼?4).WEB表單結構:
session_start();
include(”functions.php”);
?>
gen_input(); ?>
5).服務端核對令牌:
這個很簡單,這里就不再啰嗦了。
上面這個其實不完全符合“并行會話的兼容”的規則,大家可以在此基礎上修改。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态