【问题标题】:Should a CSRF check be done on all post requests?是否应该对所有发布请求进行 CSRF 检查?
【发布时间】:2021-05-23 23:49:47
【问题描述】:
【问题讨论】:
标签:
firebase
security
web
csrf
【解决方案1】:
TL;DR:
- 无论使用何种 HTTP 方法,都应在任何状态更改请求上实施 CSRF 保护(尽管 PUT 和 DELETE 请求本质上可以缓解 CSRF)
- 要防止 CSRF,请使用下面编号列表中描述的方法之一。
详情:
如您所述,在 CSRF 攻击中,攻击者希望执行状态更改操作,例如修改个人资料的电子邮件地址、转账等。
应验证触发服务器上任何操作的任何身份验证后请求。
在登录屏幕上实施 CSRF 保护是没有意义的,因为攻击者需要知道用户的密码,如果他知道用户密码,那么 CSRF 攻击是多余的。 (免责声明 - 在某些边缘情况下,例如与 self-XSS 链接,登录屏幕上的 CSRF 可能会帮助攻击者)
仅返回数据但不执行任何操作的请求不需要 CSRF 保护,因为在 CSRF 攻击中,攻击者将无权访问服务器的响应。
CSRF 攻击之所以成为可能,是因为浏览器会自动将 cookie 发送到相应的域,而无需任何编程触发或用户交互。这也意味着将 CSRF 令牌放入 cookie 是没有意义的,也不会真正缓解 CSRF。
缓解措施:
也就是说,缓解 CSRF 攻击的方法不止一种:
- 使用反 CSRF 令牌 - 一个唯一的随机值,通常存储为隐藏字段,作为发送请求的 HTML 表单的一部分。每个页面或至少每个用户会话的值应该是唯一的,并且在每个状态更改请求上由服务器验证。
- 使用存储在 Web 存储 (sessionStorage/localStorage) 中的会话令牌,而不是 cookie。由于这些值需要以编程方式发送,通常是通过一些 SPA 框架并且不会自动发送,因此默认情况下会破坏 CSRF。
- 在会话 cookie 上实现 "sameSite" flag。