java - 使用 AJAX GET 方法进行 CSRF token 保护

标签 java angularjs ajax spring spring-security

网上的信息让我有点困惑。

我在后端使用 Spring security 来使用 CSRF 保护。

我想问一下,当我使用 Ajax GET 方法在 HTTP header 中传递 token 时,从我的 Angular 前端发送 CSRF token 是否安全?

因为根据 Spring 文档,我不应该使用 GET 方法,但另一方面,当我在 HTTP header 中传递它时,它并没有说明是否可以使用 GET Ajax。

第二,

如果我不应该使用 GET,我该如何使用 REST 服务和 CSRF 保护?我应该放弃 GET 方法还是 CSRF 保护?

最佳答案

由于 GET 请求不应修改服务器上的任何状态并且应为“只读”,因此 GET 请求通常不需要 CSRF 保护。

泄漏问题主要与浏览器使用有关,因为 GET 请求通常不包含正文,因此 token 作为请求参数发送。因此,CSRF token 可以通过肩冲浪可见、存储为书签、出现在浏览器历史记录中或记录在服务器上(尽管记录也适用于 AJAX 请求)。

由于您正在谈论 AJAX 请求,因此大多数泄漏并不适用,尽管在 header 中设置它可能会在 URL 出现在日志中时有所帮助,但日志也可能包含 header 。

但实际上使用自定义 header (带或不带 token )通常用于防止 CSRF 攻击,因为 AJAX 请求无法设置除跨域之外的自定义 header

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

因此使用像 X-Requested-With: XMLHttpRequest 这样的自定义 header ,例如通过jQuery设置并在服务器上验证此 header 可以防止CSRF攻击。

最后但并非最不重要的是有一个 interesing article关于对 GET 和 POST 请求使用相同的 token ,以及通过同源中单独 Web 应用程序的 XSS 漏洞对 GET 请求进行同源访问,其中 token 可以从 GET 请求中泄漏并用于 POST。解决方案是要么不使用 CSRF token 进行 GET,要么对 GET 和 POST 使用不同的 token 。

基本上关于你的问题,如果你的 GET 没有任何副作用,那么 CSRF token 并不是真正需要的,但也不会造成伤害。另一方面,如果您的 GET 请求更改了服务器上的某些内容,您应该根据您想要执行的操作考虑使用另一个动词(例如 POST),然后使用 CSRF token 或自定义 header 保护您的 POST 请求。

关于java - 使用 AJAX GET 方法进行 CSRF token 保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40439862/

相关文章:

java - InterShop 日期比较条件不起作用

angularjs - 在 Jasmine Karma 测试中读取文件

javascript - 有 Angular 。如何在指令内部编译指令?

java - 关于 Java 命令行参数

java - NoClassDefFoundError 和 ClassNotFoundException 的原因和区别是什么?

具有 getSize().width、getSize().height 的 Java 小程序

angularjs - 如何监视 Jasmine beforeEach 代码块内创建的函数?

javascript - AJAX 调用 - "?"问题符号,其中带重音的字符

javascript - Cakephp Ajax,使用 Js Helper 获取文本字段的值

javascript - Ajax 从不调用我的 .NET 方法?