我对在线信息感到有点困惑。
我在后端使用Spring安全性使用CSRF保护。
我想问一下,当我使用Ajax GET方法在HTTP标头内传递令牌时,从角度前端发送CSRF令牌是否安全?
因为根据Spring文档,我不应该使用GET方法,但另一方面它没有说明当我在HTTP头中传递它时是否可以使用GET Ajax。
其次,
如果我不应该使用GET,我该如何使用REST服务& CSRF保护?我应该放弃GET方法还是CSRF保护?
答案 0 :(得分:2)
由于GET请求不应修改服务器上的任何状态并且应该是“只读”,因此GET请求通常不需要CSRF保护。
泄漏问题主要与浏览器使用有关,因为GET请求通常不包含正文,因此令牌作为请求参数发送。因此,CSRF令牌可以通过肩膀冲浪,作为书签存储,出现在浏览器历史记录中或在服务器上登录来显示(尽管日志记录也适用于AJAX请求)。
由于您正在讨论AJAX请求,因此大多数泄漏都不适用,尽管在标题中设置它可能有助于URL出现在日志中,但日志也可能包含标题。
但实际上使用自定义标头(带或不带令牌)通常用于防止CSRF攻击,因为AJAX请求无法设置跨域的自定义标头
因此使用像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请求。