# CSRF 攻擊
cross site request forgy(跨站請求偽造)
# CSRF 攻擊原理

# 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'] ) {
}
```