---
# System prepended metadata

title: '[資訊安全] CSRF'
tags: [資訊安全, CSRF]

---

# [資訊安全] CSRF
###### tags: `資訊安全` `CSRF`
[TOC]

## 正確防禦(1) Synchronizer Token Pattern
```!
在正確的網站上埋一個 token，在傳送請求時，都要帶這上個值。因為其他惡意網站沒有這個值，所以請求就可以被伺服器擋掉。
```
### 必要條件
* 在 Server 端根據這個 Session 存一個 CSRF token。
* 每次進入該頁面，CSRF token 都要變，具有時效性。
* 要在使用者已登入的頁面才能取得 CSRF token。
* csrf token 值必須是不可預測的。

### 防範方式
* Form Submissions
將 CSRF token 放在 form 的隱藏欄位一並送出。
```html!
<form action="https://www.購物網站/buy.php">
  <input type="hidden" name="csrf-token" value="XXXXXXXXXXXXXXXXX" />
  <button type="submit">Submit</button>
</form>
```
* Ajax Requests
將 CSRF token 放在 header 的 meta 欄位，再用 JavaScript 取出送出。
```html!
$(function() {
  var token = $("meta[name='_csrf']").attr('content');
  var header = $("meta[name='_csrf_header']").attr('content');
  $(doucment).ajaxSend(function(e, xhr, options) {
    xhr.setRequestHeader(header, token);
  });
});
```

:::danger
* 若是頁面有 XSS 漏洞，可「用程式爬取出 CSRF token 的值」，此防禦便無效。
* 必須在 Server 端也存放 CSRF token，會額外佔據 server 的儲存空間。
:::


## 正確防禦(2) Double-Submit Cookie





---
參考資料:
[[IS] 跨站偽造請求（Cross site request forgery, CSRF）是什麼？](https://pjchender.dev/internet/is-csrf/)
[CSRF Cross-site request forgery](https://easonchang0115.github.io/blogs/other/2021/20210903_1.html#%E4%BA%8C%E3%80%81double-submit-cookie)
[Spring Security CSRF預設保護的HTTP請求方法 CSRF default protect HTTP methods](https://matthung0807.blogspot.com/2019/11/spring-security-csrf-default-protection.html)
[零基礎資安系列（一）-認識 CSRF（Cross Site Request Forgery）](https://tech-blog.cymetrics.io/posts/jo/zerobased-cross-site-request-forgery/)
