我想知道这段代码是否足够强大,可以防止对PHP表单的CSRF攻击?
<?php
session_start();
session_regenerate_id(true);
if (isset($_POST['submit'])) {
if (isset($_SESSION['token']) && ($_POST['token'] == $_SESSION['token'])) {
}
}
$token = hash('sha256', uniqid(mt_rand(), true));
$_SESSION['token'] = $token;
?>
//FORM
<form method="POST" action="page.php">
<input type="hidden" name="token" value="<?php echo $token; ?>">
<input type="submit" name="submit">
</form>谢谢。
发布于 2013-05-12 08:05:23
如果受害者尚未查看您网站上的任何表单,则他的会话中还没有存储令牌。
如果攻击者向受害者呈现一个没有任何令牌字段的表单,则受害者发出的POST请求将通过CSRF检查,因为$_POST['token']和$_SESSION['token']都将为空。(或者两者都是空字符串,这取决于PHP初始化未知变量的方式。)
在检查相等之前,还必须检查会话中是否存在令牌,如果这两个测试之一失败,则中止。
根据你的网站,用户没有看过表单的可能性很大,也可能是极端的边缘情况。通过首先检查令牌的存在,无论您的网站上有多少表单,都不会有CSRF攻击的可能性。
除了这个小问题,我看不到它有任何CSRF漏洞。这段代码看起来可以完成这项工作。
发布于 2013-05-12 05:49:16
对于我支持的产品,我会说“不”。您的随机数生成器基于rand(),这是可预测的。此外,随机数看起来非常短-它需要足够长,以便在会话有效期间不能被暴力强制-也不能破解许多活动会话的任何CSRF令牌。
看看OWASP page on CSRF,他们会给你很好的指导。
https://stackoverflow.com/questions/16501984
复制相似问题