【问题标题】:How to fix CSRF in the HTTP protocol spec?如何在 HTTP 协议规范中修复 CSRF?
【发布时间】:2015-11-22 03:13:41
【问题描述】:

为了防止跨站点请求伪造的危险情况,需要对 HTTP 协议规范和浏览器行为进行哪些更改?

我不是在寻找有关如何修补我自己的网络应用程序的建议。有数百万个易受攻击的 Web 应用程序和表单。更改 HTTP 和/或浏览器会更容易。

如果您同意我的前提,请告诉我需要对 HTTP 和/或浏览器行为进行哪些更改。这不是寻找最佳单一答案的比赛,我想收集所有好的答案。

还请阅读下面我的“答案”中的要点并发表评论。

【问题讨论】:

  • “CSRF 没什么大不了的 - 呵呵!” ......“互联网上很大一部分欺诈(TOS 欺诈,不是实际的黑客攻击)与 CSRF 滥用(点击欺诈、附属欺诈等)有关。我们谈论的是数亿美元的损失单一漏洞利用,并且仅在这两种变体中。” hackers.org

标签: security http web csrf


【解决方案1】:

HTTP 规范的作者 Roy Fielding 不同意您的观点,即 CSRF 是 HTTP 中的一个缺陷,需要在那里修复。正如他在reply in a thread named The HTTP Origin Header 中所写:

CSRF 不是 Web 的安全问题。精心设计的网络 服务应该能够接收任何主机指示的请求, 通过设计,在需要时进行适当的身份验证。如果浏览器 创建一个安全问题,因为它们允许脚本自动 将存储了安全凭证的请求直接发送给第三方 网站,无需任何用户干预/配置,那么显而易见 修复在浏览器中。

事实上,CSRF 攻击从一开始就可能使用纯 HTML。当今 JavaScript 和 CSS 等技术的引入只是引入了进一步的攻击向量和技术,使请求伪造更容易和更高效。

但这并没有改变这样一个事实,即来自客户端的合法且真实的请求不一定基于用户的意图。因为浏览器确实会一直自动发送请求(例如图像、样式表等)并同时发送任何身份验证凭据。

同样,CSRF 攻击发生在浏览器内部,因此唯一可能的解决方法是在浏览器内部修复它。

但由于这并非完全可能(见上文),因此应用程序有责任实施一种允许区分真实请求和伪造请求的方案。始终传播的 CSRF 令牌 就是这样一种技术。如果实施得当并能抵御其他攻击(同样,其中许多攻击只能通过现代技术的引入),它会很好地工作。

【讨论】:

  • 我同意该问题需要在浏览器中修复。我建议 HTTP 规范应该在这里和那里说一些额外的“必须”,以便浏览器必须做正确的事情。如果 HTTP 指定了 cookie、身份验证、POST 和 GET,它还应该指定在跨站点请求的情况下如何处理 cookie、身份验证、POST 和 GET。大多数浏览器都错误地处理了这些未指定(或错误指定)的点。
  • 我有兴趣在我的“答案”中听到对提议更改的批评。我认为只有在 HTTP 规范发生变化并且协议版本发生冲突的情况下,它们才能全面实施。但是,如果我们可以在不更改 HTTP 规范的情况下做到这一点,那就更好了。拜托,我需要比“这绝对打破一切”更多的反馈。特别是,本地(默认情况下)与远程 cookie 的概念是否有用,还是会“破坏一切”?任何此类损坏的东西都可以轻松更改为使用“远程”cookie,没有额外的漏洞,但可能有额外的意识。
【解决方案2】:

我同意另外两个;这可以在浏览器端完成,但无法执行授权的跨站点请求。 无论如何,一个 CSRF 保护层可以很容易地添加到应用程序端(甚至可能在网络服务器端,以避免对预先存在的应用程序进行更改),使用如下方式:

  • cookie 被设置为一个随机值,只有服务器知道(当然还有接收它的客户端,但不是第 3 方服务器)
  • 每个 POST 表单必须包含一个隐藏字段,其值必须与 cookie 相同。如果不是,则必须阻止表单提交并将 403 页面返回给用户。

【讨论】:

  • -1 攻击者不需要知道 cookie 的值来执行 CSRF 攻击。如果他知道 cookie 的值,他就会劫持会话。在提出修复建议之前,请阅读 CSRF 的基础知识。 CSRF 预防备忘单是一个很好的起点。
  • 在投反对票之前阅读此内容:owasp.org/index.php/… -- 安全性不仅基于 cookie,还基于 cookie+post var 对,它是包括 django 在内的许多框架使用的方法。
  • -1 是错误的,所以我会 +1。双重 cookie 提交是防止 CSRF 的合理方法。但是,我问的是通过修复协议和浏览器来保护。
  • @redShadow ok well -1 用于破坏 httponly cookie,也不清楚这两种方法是否应该一起使用。
  • 在网络服务器中防止 CSRF 是一个有趣的想法,谢谢。我找到了这篇相关文章:knol.google.com/k/…
【解决方案3】:

对表单提交位置执行同源策略。只允许将表单提交回它的来源地。

当然,这会破坏各种其他东西。

【讨论】:

  • 是的,我同意,这会有所帮助(防止例如家庭路由器劫持)。 CSRF 通常也可以使用 GET + ?query 完成,因为很少有 Web 应用程序检查请求方法。我们很难取缔远程 GET + ?query。所以我建议应该提示用户允许这样做。将有一个选项总是允许在某对域之间。这将鼓励人们对可链接的 GET 请求使用 PATH 而不是查询字符串。
【解决方案4】:

如果您查看CSRF prevention cheat sheet,您会发现有一些方法可以通过依赖 HTTP 协议来防止 CSRF。一个很好的例子是检查嵌入式设备上常用的HTTP referer,因为它不需要额外的内存。

但是,这是一种较弱的保护形式。客户端的 HTTP 响应拆分之类的漏洞可用于影响referer 值,并且已经发生了这种情况。

【讨论】:

  • CSRF 是一个主要问题,因为浏览器通过跨站点请求发送了太多信息。因此,我正在研究如何更改 HTTP 规范,以便符合要求的浏览器不会通过这样的请求发送身份验证 cookie 等。我们需要在不过多干扰有效跨站点请求的情况下做到这一点。
【解决方案5】:
  • cookie 应声明为“本地”(默认)或“远程”
  • 浏览器不得通过跨站点请求发送“本地”cookie
  • 浏览器绝不能通过跨站点请求发送 http-auth 标头
  • 未经许可,浏览器不得发送跨站 POST 或 GET ?查询
  • 浏览器不得在未经许可的情况下从远程页面发送 LAN 地址请求
  • 浏览器必须报告和控制发起许多跨站点请求的攻击
  • 浏览器应该发送“Origin: (local|remote)”,即使“Referer”被禁用
  • 其他常见的 Web 安全问题(例如 XSHM)应在 HTTP 规范中解决
  • 需要新的 HTTP 协议版本 1.2,以表明浏览器符合要求
  • 浏览器应自动更新以满足新的安全要求,或警告用户

【讨论】:

  • 这绝对破坏了一切。
  • 我在这里更详细地解释了这些建议:sswam.wordpress.com/2012/03/16/…
  • @Rook ...好吧,我打算让它不会破坏任何东西。你能解释一下我的任何建议会如何破坏任何东西吗?需要对少数实际需要通过跨站点请求发送 cookie 的 Web 应用程序进行细微更改:拥有站点必须将这些声明为“远程”cookie。浏览器应请求用户允许发送跨站 POST 或 GET-with-?query;这可能(非常)烦人,但它不会破坏任何东西。用户可以选择允许任何跨站点操作,例如在本地网络中以及明显的重复攻击除外。
【解决方案6】:

已经可以做到了:

Referer标头

这是一种较弱的保护形式。出于隐私目的,某些用户可能会禁用referer,这意味着他们将无法在您的网站上提交此类表单。这在代码中实现也很棘手。某些系统允许诸如http://example.com?q=example.org 之类的URL 通过example.org 的引荐来源网址检查。最后,您网站上的任何开放式重定向漏洞都可能允许攻击者通过开放式重定向发送他们的 CSRF 攻击,以获得正确的referer 标头。

Origin标头

这是一个新的标题。不幸的是,支持和不支持它的浏览器之间会出现不一致的情况。 See this answer.

其他标题

仅对于 AJAX 请求,添加不允许跨域的标头(例如 X-Requested-With)可以用作 CSRF 预防方法。旧浏览器不会跨域发送 XHR,而新浏览器将发送 CORS 预检,如果目标域明确不允许,则拒绝发出主请求。服务器端代码需要确保在收到请求时标头仍然存在。由于 HTML 表单无法添加自定义标题,因此此方法与它们不兼容。但是,这也意味着它可以防止攻击者在 CSRF 攻击中使用 HTML 表单。

浏览器

Chrome allow third party cookies to be blocked 等浏览器。虽然解释说它会阻止第三方域设置 cookie,但它也会阻止为请求发送任何现有的 cookie。这将阻止“背景”CSRF 攻击。但是,那些打开整页或在弹出窗口中的会成功,但对用户来说更可见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-21
    • 2014-03-11
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多