使用AJAX GET方法保护CSRF令牌

时间:2016-11-05 15:20:03

标签: java angularjs ajax spring spring-security

我对在线信息感到有点困惑。

我在后端使用Spring安全性使用CSRF保护。

我想问一下,当我使用Ajax GET方法在HTTP标头内传递令牌时,从角度前端发送CSRF令牌是否安全?

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

其次,

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

1 个答案:

答案 0 :(得分:2)

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

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

由于您正在讨论AJAX请求,因此大多数泄漏都不适用,尽管在标题中设置它可能有助于URL出现在日志中,但日志也可能包含标题。

但实际上使用自定义标头(带或不带令牌)通常用于防止CSRF攻击,因为AJAX请求无法设置跨域的自定义标头

  • 接受
  • 接受语言
  • 内容语言
  • Last-Event-ID
  • 内容类型

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

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

基本上关于你的问题,如果你的GET没有任何副作用,那么实际上并不需要CSRF令牌,但不会受到伤害。另一方面,如果您的GET请求在服务器上发生了某些变化,您应该考虑使用另一个动词(例如POST),具体取决于您要执行的操作,然后使用CSRF令牌或自定义标头保护您的POST请求。