【问题标题】:CSRF Prevention Without Modification to client无需修改客户端即可预防 CSRF
【发布时间】:2014-08-18 21:12:48
【问题描述】:

我需要将 CSRF 预防集成到我们现有的 REST 服务中。

我们创建了许多剩余资源并发布了其详细信息供其他开发人员使用。组织中的任何人都可以使用它。我无法控制他如何使用它,他使用的形式或 httpclient。我不知道到目前为止谁在使用它,我无法更改所有客户。因此,我无法向表单添加隐藏的文本字段/标记,因为我无权访问客户端。另外,我不能使用双重身份验证或验证码,因为它不适用于 httpclient 实现。有没有其他方法可以防止对 CSRF 滥用 REST 服务。

【问题讨论】:

  • 由于通过 REST 您必须随每个请求发送凭据,因此您不必担心 CSRF。如果您创建了基于服务器端会话的解决方案,那么这不是 REST……您必须告诉我们更多关于您的解决方案的信息。您也许可以过滤 IP 地址。
  • 您的 REST API 是否由 Web 客户端在客户端使用?请在您的问题中添加更多详细信息。
  • @inf3rno - 感谢您的回复。我的系统并不是真正的无状态。你看,我有一个名为 Login 的 REST 接口,它为每个用户创建并返回一个会话。因此,在调用 Login REST Call 之后,如果进行了任何其他关键 REST(CRUD) 调用,则会话信息将传递回服务器并识别用户。但是网页设计师/程序员可以自行决定使用此登录和其他 REST 调用,我无权访问他们的表单/代码。
  • @SilverlightFox - 感谢您的回复。我不知道 REST 究竟是如何被使用的,但我相信有一个在 .net 中创建的客户端(由其他团队),它使用 REST 协议在服务器上执行 CRUD 操作。因此,我们只需公开服务,其他团队可以拥有 Web 表单或一些可以访问和利用这些服务的代码。
  • @devray:您是否添加了 CORS 标头以允许不同域上的浏览器客户端联系您的服务?如果不是,那么它似乎没有被浏览器直接使用,因此您不需要 CSRF 预防。

标签: rest csrf owasp


【解决方案1】:

您可以通过检查 X-Requested-With header 来做到这一点。

如果任何 Web 客户端已经在使用 JQuery,则此标头将自动传递,并确保请求不是 AJAX 或 HTML 表单的跨域请求。对于 HTML 表单,根本不会发送此标头,因此如果没有 Web 客户端使用 HTML 表单,这将起作用。

如果您的网络客户端使用纯 JavaScript,那么您可以检查 Origin 标头是否设置为有效域。请注意,当请求不是跨域时,某些浏览器的某些版本没有设置此项。

唯一的缺点是非 Web 客户端必须设置这些标头之一,或者您可以通过某种方式从 REST 服务中识别这些非 Web 客户端,以便在这些情况下绕过检查。

如果您的非 Web 客户端已发送除以下内容之外的任何标头:-

  • 接受
  • 接受语言
  • 内容-语言
  • 最后一个事件 ID
  • 内容类型

然后您可以验证该值是否已传递(而不是 X-Requested-WithOrigin),以确保这不是 CSRF 攻击,因为无法在 CSRF 攻击中发送自定义标头。甚至可以使用 User-Agent - 这只能被 HTTP 客户端欺骗,但不能被浏览器内的攻击者欺骗,这是唯一可能发生 CSRF 攻击的相关位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 2015-11-18
    • 1970-01-01
    相关资源
    最近更新 更多