何时或何时不在 API 中使用 CSRF?

When or when not to use CSRF in APIs?

Spring Security Documentation 表示

18.3 When to use CSRF protection

When should you use CSRF protection? Our recommendation is to use CSRF protection for any request that could be processed by a browser by normal users. If you are only creating a service that is used by non-browser clients, you will likely want to disable CSRF protection.

但显然有一些场景是允许的,而当您不这样做时,例如当您进行未加密的通信(即没有 SSL)时。我想知道更多有关您仍想在哪些场景中使用 CSRF 保护的信息。

背景

本质上,CSRF 围绕着恶意网站、网络钓鱼电子邮件、third-party 程序或类似性质的东西,试图让受害者的网络浏览器(即 Chrome)做他们做的事情不想做。

例如 - 您玩了一款名为 X 的视频游戏,作为玩家,您可以拥有一定数量的货币,您可以购买、出售这些货币并与其他玩家进行交易。

然后您会收到一封很酷的电子邮件,说您可以通过单击此 link 赢得很多金币。用户点击link,在不知情的情况下,突然将自己的所有财产转移到恶意用户的账户中,这一切都是通过一个简单的HTTP请求完成的。 :-(


保护方法(对于 Web 服务 [否 UI])

现在在很多情况下,Web 应用程序使用:

  • Anti-CSRF 代币
  • 验证码
  • Re-authentication(注销用户)

但是对于 REST 服务,情况略有不同。您需要使用自定义请求 header,例如 -

X-Requested-With

其背后的原因如下(引用我高度推荐阅读的OWASP article)-

"This defense relies on the same-origin policy (SOP) restriction that only JavaScript can be used to add a custom header, and only within its origin. By default, browsers don't allow JavaScript to make cross origin requests."


资源

我列出了一些您可能想要查看的资源。 CSRF 是一个非常有趣的漏洞,它将安全漏洞与社会工程联系起来。希望您会发现它们有用。