gpt4 book ai didi

security - 通过在 session 变量和表单中存储随机数来实现 CSRF 保护

转载 作者:行者123 更新时间:2023-12-02 11:19:03 28 4
gpt4 key购买 nike

为了防止 CSRF,您应该将随机数放入表单的隐藏字段、cookie 或 session 变量中。但是,如果用户在不同的选项卡中打开多个页面怎么办?在这种情况下,每个选项卡都会有一个带有唯一随机数的表单,但 session 变量或 cookie 中只会存储一个随机数。或者,如果您尝试将所有随机数存储在 cookie/session 变量中,您将如何识别哪个随机数属于哪种形式?

最佳答案

您可以在每个表单中存储相同的随机数。最简单的方法是将随机数与 session ID 联系起来,以便这些表单仅在该 session 中起作用。

您需要让攻击者难以窃取 session ID 并创建自己的随机数。因此,解决此问题的一种方法是使用 HMAC-SHA256(或类似的)来散列 session ID,并使用不向公众公开的 key 。

(显然,如果攻击者本身能够获取实际的 session ID,他们就已经可以进行 session 劫持。所以这不是我所说的,而是攻击者制作脚本(在受害者的计算机上运行)的能力计算机),可以以某种方式获取 session ID 并使用它来动态生成预填充随机数的 URL。)

<小时/>

预计到达时间:上述方法本身是否足够取决于您期望典型 session 持续多长时间。如果用户通常使用持续时间超过几个小时的持久 session ,您将需要使用更复杂的东西。

一种方法是为每个表单创建一个新的随机数,其中包含时间戳以及 hash(timestamp . sessionid) (其中 hash 是HMAC如上所述,防止伪造,.是字符串拼接)。然后,您可以通过以下方式验证随机数:

  1. 检查时间戳以确保随机数足够新鲜(这取决于您的政策,但通常是几个小时)
  2. 然后,根据时间戳和 session ID计算哈希值,并与nonce进行比较,以验证nonce的真实性

如果随机数检查失败,您将需要显示一个新表单,其中预先填充了用户提交的内容(这样,如果他们花了一整天的时间来写帖子,他们也不会失去所有的辛勤工作) ,以及一个新鲜的随机数。然后用户可以直接重新提交成功。

关于security - 通过在 session 变量和表单中存储随机数来实现 CSRF 保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2250263/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com