# [資訊安全] 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/)