查看源代码导致我的CSRF令牌发生变化

时间:2018-02-04 15:42:32

标签: php security csrf

我有一个登录表单,我在其中使用隐藏字段,我正在设置具有随机值的会话以避免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']值为隐藏值。如何应对这个?

2 个答案:

答案 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
  }

参考:https://gist.github.com/ziadoz/3454607

答案 1 :(得分:1)

问题在于,在某些浏览器和情境中,查看源会导致浏览器请求页面的新副本,而不是向您显示已有的副本。如果您在不同的标签页中打开两个网站页面,则会出现同样的问题,这对您的实际最终用户来说更为可能。

CSRF令牌正在防范的主要攻击是用户根本没有加载的链接或表单,而不是很久以前加载的链接或表单,因此您可以通过保留最近的令牌列表来改进在会话中,而不是仅仅是最近的。您可以将到期时间与每个令牌相关联,因此几小时后不能使用已保存的页面,这也有助于避免用户根据过时数据提交内容时出现问题。您不希望同一令牌被接受两次,因此请记住在使用它时将其从列表中删除。

在某些高安全性的情况下,您可能希望严格并避免任何深层链接,后退/前进导航或选项卡式浏览,因此当前行为将是您想要的。例如,许多在线银行应用程序会执行此操作,如果用户按“错误的顺序”导航,则会强制用户重新登录,因此有人在关闭窗口并继续会话后无法访问计算机。