gpt4 book ai didi

forms - 网站在多个选项卡中打开时的 csrf 哈希 token 行为

转载 作者:行者123 更新时间:2023-12-04 06:06:01 24 4
gpt4 key购买 nike

我正在尝试集成一种向应用程序中的每个表单添加哈希 token 的方法。我想通过以下方式实现目标:

  • 防止 csrf 攻击
  • 防止用户在提交表单后重新加载页面时重新提交表单

  • 现在,我认为这样做的概念应该很简单:
  • 我生成一个唯一的哈希并将其保存到 cookie
  • 我使用生成的哈希在表单中创建一个隐藏字段
  • 在处理表单中的 $_POST 数据之前,我验证表单中的哈希值是否与 cookie 中的哈希值匹配。

  • 到目前为止一切顺利,现在我真正陷入困境的是以下场景:

    如果用户使用我的应用程序打开另一个选项卡怎么办。每次加载页面时,都会重新生成哈希值。从而使第一个选项卡中表单的哈希值无效。

    最佳答案

    不要将 token 存储为 cookie。

    在每次页面展示时生成唯一标记。在 POST 时,验证您是否已向该用户颁发了 token ,并验证它之前未被使用过。

    首先,我们生成一个 token ,我们可以在其中验证我们是否为给定用户颁发了它:
    token = hash(session_id + secret)
    这样,使用他们的 session ID 和我们的 secret ,我们总是可以验证我们是否发布了该 token ,因为没有人知道 secret 。

    现在我们需要确保 token 只能使用一次。

    rnd = rand()
    token = rnd + hash(session_id + secret + rnd)

    token 现在有一个随机数。当 POST 发生时,我们可以将此随机数存储为“之前已使用过”并拒绝任何重复使用相同随机数的 token 。

    但是我们不想永远存储使用过的 token 的随机数。所以我们限制了代币的生命周期。
    rnd = rand()
    now = time()
    token = rnd + time + hash(session_id + secret + rnd + time)

    在 POST 上,当我们获得 token 时,我们现在检查我们是否“最近”发布了它。我们只需要存储相同时间跨度内使用过的随机数。根据定义,所有较旧的 token 都是无效的。

    您可以保护使用过的随机数和 session ID,并在您驱逐 session ID 或当它们变得无效时(以先发生者为准)删除它们。

    关于forms - 网站在多个选项卡中打开时的 csrf 哈希 token 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8350126/

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