【问题标题】:View Source Code causing change in my CSRF Token查看导致我的 CSRF 令牌发生变化的源代码
【发布时间】:2018-07-14 13:25:55
【问题描述】:

我有一个登录表单,我在其中使用了一个隐藏字段,我正在使用随机值设置会话以避免 CSRF 攻击,就像这样

<input type="hidden" name="valid" value="<?= $_SESSION['validation'] ?>">

这就是我设置 $_SESSION['validation']

$_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'] 值,而我们之前打开的登录页面在表单中有旧的$_SESSION['validation'] 值作为隐藏值。如何应对?

【问题讨论】:

    标签: php security csrf


    【解决方案1】:

    问题在于,在某些浏览器和情况下,查看源代码会导致浏览器请求页面的新副本,而不是向您显示它已有的副本。如果您在不同的选项卡中打开网站的两个页面,也会出现同样的问题,这对于您的实际最终用户来说更有可能发生。

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

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

    【讨论】:

      【解决方案2】:

      这同样适用于验证码的情况。所以最终用户不会查看源代码。验证将正常进行。

      如果您仍想生成相同的令牌,那么在生成新令牌时,请按照以下步骤操作:

      // 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

      【讨论】:

      • 如果用户查看源代码,我的令牌不会改变吗?
      • 按照上述方法 if (!isset($_SESSION['validation'])) { $_SESSION['validation'] = Hash::create('md5', rand(30, 3000) , 散列键); } 。在页面刷新期间拉回它也不会改变。我们需要在表单提交期间更改此值。
      猜你喜欢
      • 2015-07-22
      • 1970-01-01
      • 2017-10-30
      • 2017-07-22
      • 2010-12-20
      • 2018-08-27
      • 2021-08-17
      • 1970-01-01
      相关资源
      最近更新 更多