据我所知,应该对任何更改状态的请求进行CSRF检查。
如果是这种情况,难道所有POST请求都不应该进行CSRF检查吗?
如果不是这样,还有什么例外?
这个问题的来源于一个关于使用Firebase管理会话Cookie的教程,它们在最初的登录步骤中使用CSRF检查,但在稍后的请求中不使用
https://firebase.google.com/docs/auth/admin/manage-cookies#node.js_2
TL;DR:
- CSRF保护应在任何状态更改请求上实现,无论使用何种HTTP方法(尽管PUT和DELETE请求在某种程度上固有地减轻了CSRF(
- 为了防止CSRF,请使用以下编号列表中描述的方法之一
详细信息:
正如您所提到的,在CSRF攻击中,攻击者希望执行状态更改操作,如修改配置文件的电子邮件地址、转账等。
任何触发服务器上任何操作的后身份验证请求都应该经过验证。在登录屏幕上实施CSRF保护是没有意义的,因为攻击者需要知道用户的密码,如果他知道用户密码,则CSRF攻击是多余的。(免责声明-在某些边缘情况下,如与自身XSS链接,登录屏幕上的CSRF可能会帮助攻击者(
只返回数据但不执行任何操作的请求不需要CSRF保护,因为在CSRF攻击中,攻击者无法访问服务器的响应。
CSRF攻击之所以成为可能,是因为浏览器会自动将cookie发送到相应的域,而不需要任何程序触发或用户交互。这也意味着,在cookie中放入CSRF令牌毫无意义,实际上也不会减轻CSRF。
缓解措施:
也就是说,缓解CSRF攻击的方法不止一种:
- 使用反CSRF令牌-一个唯一的随机值,通常作为发送请求的HTML表单的一部分存储为隐藏字段。每个页面或至少每个用户会话的值都应该是唯一的,并由服务器在每个状态更改请求上进行验证
- 使用存储在web存储(sessionStorage/localStorage(中的会话令牌,而不是cookie。由于这些值将需要以编程方式发送,通常通过一些SPA框架发送,并且不会自动发送,因此默认情况下会使CSRF失效
- 实现";sameSite";会话cookie上的标志