【发布时间】:2017-02-15 17:23:11
【问题描述】:
我读过很多关于 CSRF 的文章,几乎所有文章都有相同的解决方案,即隐藏令牌,所以我写了一个代码来防止 CSRF,然后我尝试破解我自己的页面,但它没有用,我想知道我的代码是否是 CSRF 防弹的,以及它周围是否有任何东西。
我有四个页面,其中包含表单,因此在每个页面中我会写以下内容:
if (isset($_POST['submit'])){
// Check for CSRF token
if ($_SESSION['token'] === $_POST['token']){
// write to db
}else{
// CSRF attack has been detected
die("CSRF :<br>1: $_SESSION[token] <br> 2: $_POST[token]");
}
}else{
// assign CSRF prevention token
$form_token = md5((rand(1,89412) * 256 / 4).$date.time());
$_SESSION['token'] = $form_token;
}
?>
<form action='' method='post'>
<input type='hidden' name='token' value='<?echo $form_token;?>'>
这种方法足以阻止攻击者在我的网站上使用 CSRF 吗?
非常感谢。
【问题讨论】:
-
这可以防止发布“盲目”或自动提交表单......这只是防止攻击的一部分。您的会话 (id) 也必须是安全的,因此它不会被劫持 - 会话 cookie 也是如此。
-
这是否意味着我的网站仍然容易受到 CSRF 的攻击?如果是这样,我该如何预防。
-
好吧,我不是安全专家……但如果我设法劫持了您/用户的会话 ID,那么表单令牌将毫无用处。
-
感谢 Djot 的快速回复,除了始终使用 https,我还能做些什么来保护我的会话?
-
重新生成会话,当用户登录/注销时,获得更高的权限等(php.net/manual/en/function.session-regenerate-id.php)。最好不要使用标准会话,这可能在共享主机中容易受到攻击 (php.net/manual/en/function.session-set-save-handler.php)。尝试在适用的情况下散列 + salt 数据(密码等)
标签: php csrf csrf-protection