【问题标题】:Send CSRF token to javascript将 CSRF 令牌发送到 javascript
【发布时间】:2015-03-26 08:46:10
【问题描述】:

假设我在会话中的服务器端维护一个反 CSRF 令牌

如果我的表单生成是动态的,我应该如何将令牌传递给客户端应用程序(即表单将在 javascript 执行某些操作后创建)

有没有办法将令牌传递给 javascript,以便我可以在表单中注入令牌。

我发现的一种工作方式是将 cookie 发送到包含令牌的浏览器,然后由 javascript 提取该令牌。

有什么建议吗?

【问题讨论】:

    标签: php javascript csrf


    【解决方案1】:

    我建议从安全令牌开始,然后根据动态表单创建通过 JavaScript 改进它。

    例如:

    <input type="hidden" name="csrftoken" value="hgdillksdbgjksdbkvbskb">
    

    页面加载时在服务器端生成“value”参数。

    然后你有一个像这样的脚本:

    csrftoken = document.mainform.csrftoken.value;
    # Do something with the CSRF token, like add dynamic values, like sha256(csrftoken + "dynamicvalue");
    document.mainform.csrftoken.value = csrftoken;
    

    这样做的主要思想是防止,即使他们设法获得允许对手读取 JavaScript 代码的漏洞,他们仍然无法构成有效的 CSRF 令牌,因为他们无法读取原始“ csrftoken" 页面加载时表单内的值。 这也可以用于“链接”AJAX 请求,就像您在页面加载期间从令牌 X 开始一样。然后使用 JavaScript 将其转换为 Y,以 AJAX 请求发送。在下一个 AJAX 请求中,您可以在算法中使用 Y 作为基础,创建 Z,然后发送到服务器。攻击者无法访问 X,因此他们既无法访问 Y,也无法访问 Z,即使他们能够以某种方式利用正在运行的 JavaScript 代码来暴露自己。

    请注意,由于同源策略,对手无法读取页面内容。但是 Javascript 可以包含可以读取实际运行的 JavaScript 代码的漏洞。目前没有这样的漏洞,但最好是安全而不是抱歉。

    【讨论】:

    • 无法读取原始 CSRF 令牌?如果不使用 Javascript,CSRF 令牌无论如何都会在隐藏的输入中可见。
    • 这个想法是在页面加载时,javascript 用新的输出令牌覆盖输入令牌。最好使用散列函数等。因此,如果稍后加载漏洞利用,它将无法找出原始输入令牌。
    • 但是,如果我有一个用于生成 CSRF 的双向 PHP 加密类,那就没有问题了。如果可见或不可见,则不得编辑。如果没有,当验证 SESSION CSRF 和 INPUT CSRF 将失败。我错了吗?
    【解决方案2】:

    当然。如果您在客户端动态生成表单,那么您是从某种模板中进行的。令牌应该是该创建函数的参数。

    在请求/渲染时将令牌传递给客户端,然后在表单生成时将其作为隐藏元素注入到表单中。

    【讨论】:

      猜你喜欢
      • 2018-05-10
      • 2021-04-06
      • 1970-01-01
      • 2018-03-20
      • 2018-08-27
      • 2018-08-19
      • 1970-01-01
      • 2016-06-19
      • 2021-04-03
      相关资源
      最近更新 更多