CSRF(Cross-Site Request Forgery,跨站請求偽造)是一種常見的網絡安全攻擊方式,攻擊者通過欺騙用戶發送惡意請求,從而在用戶不知情的情況下執行危險操作,如更改用戶密碼、轉賬等。
常規的防范CSRF攻擊的方式是在表單中添加一個CSRF Token,每次提交表單時都要攜帶這個Token,服務端驗證Token是否合法。但是對于使用JSON作為請求體的情況,這種方式不再適用。
解決這個問題的方式是,在每次請求中都添加CSRF Token,并在請求頭中以“X-CSRF-Token”為鍵名,Token值為鍵值,如下所示:
fetch('/url', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': 'tokenValue' }, body: JSON.stringify({ data: 'example' }) })
在服務端校驗時,獲取請求頭中的“X-CSRF-Token”鍵對應的值與服務端保存的Token進行比對,若相同表示請求合法。
在前端,可以通過以下方式在每次請求中添加CSRF Token:
const token = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); fetch('/url', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': token }, body: JSON.stringify({ data: 'example' }) })
上述代碼中,從頁面元素中獲取Token值,使用“X-CSRF-Token”為鍵名,Token值為鍵值添加在請求頭中。
通過在請求頭中添加CSRF Token,可以有效防范CSRF攻擊,在實際開發中需要注意服務端的處理方式是否支持此方式。