Security 如何修复HTTP协议规范中的CSRF?

Security 如何修复HTTP协议规范中的CSRF?,security,http,web,csrf,Security,Http,Web,Csrf,为了防止跨站点请求伪造的危险案例,需要对HTTP协议规范和浏览器行为进行哪些更改 我不是在寻找关于如何修补我自己的web应用程序的建议。有数百万易受攻击的web应用程序和表单。更改HTTP和/或浏览器会更容易 如果您同意我的前提,请告诉我需要对HTTP和/或浏览器行为进行哪些更改。这不是一个寻找最佳答案的竞赛,我想收集所有的好答案 请阅读并评论我下面“答案”中的要点。对表单提交位置强制执行相同来源政策。只允许将表单提交回其来源地 当然,这会破坏所有其他方面。如果你看一下,你会发现有一些方法可以通

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

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

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


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

对表单提交位置强制执行相同来源政策。只允许将表单提交回其来源地

当然,这会破坏所有其他方面。

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


然而,这是一种薄弱的保护形式。客户端上的HTTP响应拆分等漏洞可能会影响referer值,这种情况已经发生。

我同意另外两种说法;这可以在浏览器端完成,但不可能执行授权的跨站点请求。 无论如何,在应用程序端(甚至可能在Web服务器端,为了避免对已有的应用程序进行更改),可以很容易地添加CSRF保护层,如下所示:

  • cookie被设置为随机值,只有服务器(当然还有接收cookie的客户端,但不是第三方服务器)知道该值
  • 每个POST表单必须包含一个隐藏字段,其值必须与cookie相同。否则,必须阻止表单提交,并将403页返回给用户
      • Cookie应声明为“本地”(默认)或“远程”
      • 浏览器不得发送带有跨站点请求的“本地”cookie
      • 浏览器决不能发送带有跨站点请求的http auth头
      • 未经允许,浏览器不得发送跨站点帖子或GET?查询
      • 未经许可,浏览器不得从远程页面发送LAN地址请求
      • 浏览器必须报告和控制攻击,其中有许多跨站点请求
      • 即使禁用了“Referer”,浏览器也应发送“Origin:(local | remote)”
      • 其他常见的web安全问题(如XSHM)应该在HTTP规范中解决
      • 需要新的HTTP协议版本1.2,以表明浏览器符合要求
      • 浏览器应该自动更新以满足新的安全要求,或者警告用户

      HTTP规范的作者Roy Fielding不同意您的观点,即CSRF是HTTP中的一个缺陷,需要在那里修复。正如他在一封信中写道:

      CSRF不是Web的安全问题。精心设计的网站 服务应能够接收任何主机发出的请求, 通过设计,在需要时具有适当的身份验证。如果浏览器 创建安全问题,因为它们允许脚本自动 将具有存储的安全凭据的请求直接发送到第三方 在没有任何用户干预/配置的情况下 修复程序位于浏览器中

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

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

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


      但由于这并不完全可能(见上文),应用程序有责任实现一个方案,允许区分真实请求和伪造请求。始终传播的CSRF令牌就是这样一种技术。当正确实施并防止其他攻击时(其中许多攻击也是由于现代技术的引入才可能发生的),它可以很好地工作。

      已经可以做到:

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

      原点
      标题 这是一个新的标题。不幸的是,支持和不支持它的浏览器之间会出现不一致

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

      浏览器 浏览器,比如Chrome。虽然解释说它会