# CSRF 攻击
cross site request forgy(跨站请求伪造)
# CSRF 攻击原理
![](https://img.kancloud.cn/40/4b/404bfefdc480d2ecb8a88db564fa78bc_2498x862.png)
# CSRF 攻击危害
* 利用用户登录态
* 用户不知情
* 完成业务请求
* 盗取用户资金(转账、消费)
* 冒充用户发帖背锅
* 损坏网站名誉
# 攻击特征
* B网站向A网站请求
* 带A网站Cookies
* 不访问A网站前端
* (http头中)referer为B网站
# 攻击防御
* “带A网站Cookie” : 禁止第三方网站带Cookies
> set-cookie 的时候对`samesite`属性的设置(strict / lax / none)
* “不访问A网站前端” : 在前端页面加入验证信息
> * 验证码
> 生成图形验证码:ccap 插件 (npm install ccap -S)
>
> * token
> 后端生成一个随机串`csrf-token`,以`set-cookie`以及**页面内容**的方式发给前端(前端页面可以保存在表单的隐藏域中,也可以保存在meta域中),前端在请求体和请求头的cookie中分别发送该随机串给后端,后端验证是否一致。
* “referer 为B网站”:验证 referer,禁止来自第三方网站的请求
> node 环境 koa 框架下获取referer:ctx.request.headers.referer
# PHP 防御 CSRF
* Cookie 的 samesite 属性
```
// 由于php中的 setcookie() 函数不能设置 samesite 属性,所以我们用 header() 函数
header('Set-Cookie: test=1234; SameSite=Lax');
```
* HTTP referer 头
```
if ( $_SERVER['HTTP_REFERER'] && strpos($_SERVER['HTTP_REFERER'], 'http://testdomain.com') === 0 ) {
}
```
* token
```
if ( $_POST['csrfToken'] === $_COOKIE['csrfToken'] ) {
}
```