禁用 Ajax 调用的 CSRF 保护 - 它有多糟糕?

Posted

技术标签:

【中文标题】禁用 Ajax 调用的 CSRF 保护 - 它有多糟糕?【英文标题】:Disable CSRF protection for Ajax Calls - How bad is it? 【发布时间】:2015-10-06 06:27:41 【问题描述】:

各位,我在 Laravel 5 中的 CSRF 和 ajax 调用遇到了很多麻烦。

我在标头中的每个 ajax 调用中发送 X-CSRF 令牌,如下所述:http://laravel.com/docs/master/routing#csrf-x-csrf-token

问题是,随机无法验证令牌,我最终得到以下错误:

TokenMismatchException in VerifyCsrfToken.php line 46:

它最终会在 10 次调用中发生 1 次,但仍然使我的应用程序表现不佳,因为它非常依赖这些 ajax 调用。

所以我在这里发布了这个问题,但我得到的最佳回应是“禁用 CSRF”。

我有两个问题:

1) 为 ajax 调用禁用 CSRF 会使我的网站易受攻击吗?

2) 如果我找不到其他方法只能禁用 CSRF,是否还有其他方法可以保护?

【问题讨论】:

如果您禁用 ajax 调用的 CSRF 验证,您的服务器将允许外部请求,例如 Web 服务或 Web API;因此,如果有人知道 url 和变量,他可以向您的服务器调用 ajax 请求,并且您的服务器会允许它;就是这样,如果你不关心这个,也许你不会有任何问题。 好吧,我的代码正在检查进行 ajax 调用的用户是否有权执行他想要的操作,如果他已登录,我想他可以发送任何他想要的调用..所以我应该没事吧?是否有任何类型的滥用可以由此产生?可能是垃圾邮件发送者或攻击者? @CarlosHerreraPlata 可能有一些错误。基于用户会话的 CSRF 攻击。您不能仅使用 url 伪造会话。在大多数情况下,ajax 没有真正的风险,因为所有现代浏览器都阻止了 ajax 跨域。除非你强制允许 Cross-Origin XMLHttpRequest 允许 ajax 跨域。 【参考方案1】:

XSS 攻击背后的想法是,其他网站诱骗您的用户使用他们的会话在您的应用程序上执行操作。

存在多种类型的 XSS 攻击。以下只是可能发生的一种类型的简单示例。

因此,假设您有一个删除网站的管理员路径:/self-destruct。现在,假设您以管理员身份登录到您的网站。您可以访问该路线,但您绝不会意外前往。

现在的想法是,当您浏览网页时,您会遇到一个恶意网站,该网站出于某种原因将您的浏览器重定向到您应用程序上的 /self-destruct 路由。

具有 CSRF 保护:恶意网站没有适当的 CSRF 令牌给您以传递到您的路线。由于您的路线需要正确的 CSRF 令牌,您将收到 TokenMismatchException 错误并且您的网站正常。

没有 CSRF 保护:恶意网站不需要任何额外的东西。他们已将您(已登录的管理员用户)重定向到您的管理员自毁路线。您的网站现已消失。

安全始终是一种平衡行为。如果您认为您的网站不存在 XSS 攻击的任何风险,请不要担心。如果您正在开发银行应用程序并且您不希望 XSS 攻击能够将任何易受攻击的用户的所有资金转移到离岸银行账户,那么 CSRF 将是一个好主意。

【讨论】:

很好的例子。我更多地考虑“网站重定向到您登录的网站上的股票购买链接”。换句话说,您最终购买了您从未打算购买的股票。你不知道它是怎么发生的。其他示例包括电子邮件表单或社交媒体发布垃圾邮件。 也许你可以在会话配置中增加会话超时,它会改善一点。另一种可能的方法是在间隔后通过 ajax 获取/刷新 csrf。 @Alpha 是否有可能我为同一个用户生成多个会话?我设法调试了令牌比较,有时它与通过 ajax 调用发送的不同。有时它会在 2 分钟内更改两次。我在 laravel 配置中的会话生命周期设置为 120 这有什么问题?顺便说一句,一次只有一个,如果你这样做,令牌会更新双方。

以上是关于禁用 Ajax 调用的 CSRF 保护 - 它有多糟糕?的主要内容,如果未能解决你的问题,请参考以下文章

用于ajax调用的spring security csrf保护

如何在Spring启动应用程序中进行REST调用而不在Spring安全性中禁用CSRF保护?

如何使用 express.js 在 Ajax 调用中实现 CSRF 保护(寻找完整示例)?

如何为 Symfony3 上的 AJAX 调用添加 CSRF 保护?

如何在javascript中对具有csrf保护的django框架进行正确的ajax调用?

Rails 3.2 - 为控制器操作禁用 CSRF 保护