【问题标题】:Why Having a CSRF protection in a REST context doesn't make sense?为什么在 REST 上下文中使用 CSRF 保护没有意义?
【发布时间】:2015-11-01 21:32:43
【问题描述】:

请有人解释一下(希望对新手用简单的话)为什么基于 RESTful API 构建的 Web 应用程序可以免于 CSRF?

我在询问:Serializing FormView data in JSON 后收到了这样的断言,但老实说我不知道​​为什么?

提前致谢

【问题讨论】:

  • 浏览器使用 REST api 是有意义的。如果浏览器不使用它(比如 curl),那么 CSRF 就不是问题。

标签: forms rest csrf crud


【解决方案1】:

CSRF 或跨站点请求伪造,用外行的话来说,意味着只允许选定的来源(您自己的网站)向特定的 url 提交数据。它可以防止其他网站或机器人滥用您的功能。

说,我有一个注册 url,/registration/,但我不想让外部提交 POST 数据到/registration/。因此,当为/registration/ 发出 GET 请求时,我将提供一个 crsf cookie(取决于主机和其他内容),并确保为 POST 请求提供相同的 cookie。这将确保请求注册表的用户(即真正的网络用户,而不是机器人)能够注册。它不是完全可靠的,但可以确保一定程度的安全性。

现在,我们不在 API 中使用 CSRF,原因如下:-

  1. 从技术上讲,CSRF 是作为 cookie 存储的,因为浏览器不是 API 的预期客户端,所以没有用。

  2. 其次,API 应该使用专门的客户端和用户身份验证,从而无需使用任何 CSRF 保护。

  3. 第三,Restful api 应该是无状态的,因此 API 调用的顺序应该无关紧要,这对于 CSRF 的工作至关重要。

注意:-

如果你有 Angular 这样的前端框架或者打算在浏览器上使用 api,那么使用 CSRF 是完全可以的。在这种情况下,您应该为您的 api 编写两种类型的身份验证。

  1. 基于令牌的身份验证 - 适用于非浏览器客户端
  2. 会话身份验证 - 用于基于浏览器的客户端(使用 csrf)

在这种情况下,对 api 的任何请求都必须通过至少一种身份验证进行身份验证。

【讨论】:

  • 我看到你也和SimoV8有同样的想法(浏览器不是API的预期客户端)。请消除我的困惑,我正在构建一个 Web 项目,我希望尽可能多的设备可以访问该项目,因此我正在从 HTML 渲染转换为 JSON。我们可以说我正在构建一个 API 吗?浏览器是第一个预期目标,但我也希望移动应用程序可以访问数据....提前感谢并特别感谢您像您一样简单地解释 csrf 攻击
  • 我以为您打算将 csrf 与您的 api 的外部客户端一起使用。我的错,我已经编辑了我的答案。如果您有任何疑问,请告诉我。
  • 感谢您的帖子、编辑和时间。现在变得更清楚了。如果我有问题,我会单独发布并在此处签名。再次感谢,祝您有美好的一天
【解决方案2】:

根据owasp.org

跨站请求伪造 (CSRF) 是一种攻击类型,当恶意网站、电子邮件、博客、即时消息或程序导致用户的 Web 浏览器执行不需要的操作时发生在用户当前已通过身份验证的受信任站点上。

这对于 REST Web 服务来说不是问题,因为:

1) 您通常希望您的服务可以从多个应用程序(移动应用程序、浏览器等)访问

2) 您必须为每个请求提供直接身份验证,因此这种攻击不适用于 REST 服务。身份验证由您的应用程序(比如说 javascript)完成,而不是直接由您的浏览器完成(发送会话 id),因此即使恶意应用程序将用户重定向到您的网页,它也无法自动触发您的 javascript 函数来执行请求(和认证)。

【讨论】:

  • 我不同意 1) 也不理解 2)。我很抱歉可能是个白痴,但我知道浏览器可能是 API 的消费者之一(我们现在倾向于从服务器返回 JSON 而不是 HTML,以扩大即将到来的物联网中可能的客户端集( js web 应用,原生 iOS 应用,原生 android 应用,甚至是像烤面包机这样的智能设备......))。所以浏览器就是其中之一。还有authentication is done by your application (let's say javascript) and no directly by your browser 让我觉得我是零。非常感谢任何链接或文档。非常感谢
猜你喜欢
  • 1970-01-01
  • 2018-01-29
  • 2015-09-17
  • 2017-01-21
  • 2013-08-07
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
相关资源
最近更新 更多