CSRF
攻击原理

如上图所示,简单地说,就是攻击网站内部 B 嵌入了对被攻击网站 A 的请求。如果 A 已经是登录状态,且请求时携带了自身的 cookie 信息,A 网站可能会认为 B 中发起对 A 网站的请求也是一个合理请求,从而进行相应。
攻击网站构造的请求可能是嵌入在 img 中,也可能是自动执行的脚本,GET 形式的请求较为常见,不过也会有 POST 形式的请求。
危害
会发起用户预期之外的请求,如对银行网站会造成意料之外的消费
防范方法
token 校验
服务端渲染浏览器表单的时候,在一个 hidden 字段中嵌入一个随机的 token 值,当接收到请求后,服务端会对这个 token 进行校验。
攻击网站无法获取到这个 token,因此也就没法通过表单校验了
Refer 头校验
HTTP 请求头中的 Refer 会记录请求发起 URL 地址,如果请求是在 B 网站发出的,则记录的 Refer 则会记录 B 的 URL,服务端可以判断这个字段值是否属于 A 的地址,来决定是否接受该请求。
一般可以把 Refer 头的校验统一放入中间件即可
不过要注意 Refer 是否能被篡改的问题,现代浏览器似乎都不容易被篡改了
Cookie samesite 选项
chrome 较新的版本已经引入了 samesite 选项。其作用是决定第三方网站发起的请求是否进行禁用。
其有三个选项:
- Strict
- Lax
- None
Strict: 完全禁止第三方 Cookie
Lax: 部分禁止第三方 Cookie
None: 不禁止第三方 Cookie,但必须与 Secure 选项搭配(即要求 Cookie 必须通过 HTTPS 协议发送)
具体信息如下表所示
当浏览器支持了这个特性,只要我们设置了
Set-Cookie: CookieName=CookieValue; SameSite=Strict;
便可以杜绝 CSRF 攻击