我有一个登录表单,我在其中使用隐藏字段,我正在设置具有随机值的会话以避免CSRF攻击,如此
<input type="hidden" name="valid" value="<?= $_SESSION['validation'] ?>">
这就是我设置$ _SESSION [&#39;验证&#39;]
的方法$_SESSION['validation'] = Hash::create('md5', rand(30, 3000), HASH_KEY);
当用户登录时检查
if ($_SESSION['validation'] == $_POST['valid']) {
//login
} else {
// Invalid Request
}
因此,当用户点击登录页面上的提交按钮时,将比较$_SESSION['validation']
的值以进行额外的安全检查。现在的问题是,如果打开登录页面,之后我打开查看源代码页面,然后我回到登录页面并点击登录按钮。
我面临"Invalid Request"
因为打开视图源代码页会更改$_SESSION['validation']
值,而我们之前打开的Login Page在表单中的旧$_SESSION['validation']
值为隐藏值。如何应对这个?
答案 0 :(得分:1)
同样适用于Captcha的情况。因此最终用户不会查看源代码。验证将通过正常。
如果您仍想生成相同的令牌,那么在生成新令牌时请遵循以下步骤:
// Create a new CSRF token.
if (! isset($_SESSION['validation'])) {
$_SESSION['validation'] = Hash::create('md5', rand(30, 3000), HASH_KEY);
}
//once validation is complete / successfully / failed then generate a new token
if ($_SESSION['validation'] == $_POST['valid']) {
$_SESSION['validation'] = Hash::create('md5', rand(30, 3000), HASH_KEY);
//process the form data
}
答案 1 :(得分:1)
问题在于,在某些浏览器和情境中,查看源会导致浏览器请求页面的新副本,而不是向您显示已有的副本。如果您在不同的标签页中打开两个网站页面,则会出现同样的问题,这对您的实际最终用户来说更为可能。
CSRF令牌正在防范的主要攻击是用户根本没有加载的链接或表单,而不是很久以前加载的链接或表单,因此您可以通过保留最近的令牌列表来改进在会话中,而不是仅仅是最近的。您可以将到期时间与每个令牌相关联,因此几小时后不能使用已保存的页面,这也有助于避免用户根据过时数据提交内容时出现问题。您不希望同一令牌被接受两次,因此请记住在使用它时将其从列表中删除。
在某些高安全性的情况下,您可能希望严格并避免任何深层链接,后退/前进导航或选项卡式浏览,因此当前行为将是您想要的。例如,许多在线银行应用程序会执行此操作,如果用户按“错误的顺序”导航,则会强制用户重新登录,因此有人在关闭窗口并继续会话后无法访问计算机。