【问题标题】:Is this a secure way to prevent Cross-site Request Forgery (CSRF) attacks?这是防止跨站点请求伪造 (CSRF) 攻击的安全方法吗?
【发布时间】:2015-07-14 11:15:08
【问题描述】:

我们的应用是这样的:

  • 每个用户都必须登录
  • 登录页面发回服务器,如果授权用户返回一个 SPA 应用程序。
  • SPA 应用完全是 AJAX
  • HTTPS

通常我们会发送一个sessionid cookie 和一个csrftoken cookie。令牌 cookie 值将作为 x-header 包含在任何 AJAX 帖子中,并在每个请求的服务器上验证所有内容。

由于 SPA 页面是在将其返回到浏览器之前构建的,因此我们可以在其中嵌入任何我们喜欢的内容。我们希望最终用户能够在多个选项卡上登录,其中一个不影响其他选项卡。

我们宁愿做什么:

  • 像以前一样将 sessionid 作为 cookie 发送,但 cookie 名称是随机的。
  • 没有 csrftoken,而是在将 x-header 添加到 AJAX 发布请求的 javascript 例程中嵌入随机 cookie 名称。
  • 服务器将从 x-header 中获取 sessionid。

这使我们有机会允许多次登录,每次登录都有一个唯一的 sessionid cookie 名称,但每个 post 请求都有一个标准化的 x-header 名称。

这会和 sessionid cookie、csrftoken cookie/x-header 方法一样安全吗?

【问题讨论】:

    标签: javascript ajax cookies csrf


    【解决方案1】:

    是的,添加攻击者无法从有效用户会话中复制的标头是一种方法。

    例如X-Requested-With 可以添加到每个 AJAX 请求中(JQuery 默认执行此操作),您只需在服务器端接收请求时检查此标头是否存在。如果服务器未通过 CORS 选择加入,则无法跨域发送此标头。

    您可以将其与令牌结合使用 - see my answer here

    例如

    X-Requested-With: XMLHttpRequest;0123456789ABCDEF
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-02
      • 2016-12-26
      • 2015-07-08
      • 2017-01-09
      • 2019-05-26
      • 2017-01-10
      • 2019-03-24
      • 2014-08-31
      相关资源
      最近更新 更多