CSRF (Cross-Site Request Forgery)
CSRF 為一種類似詐騙的手法,藉由偽造的第三方網站內容誘騙受害者連線,該受害者需已透過身分驗證拿到目標網站的 Session,導致在不知情狀況下,受害者開啟了偽造網站後觸發了對目標網站以受害者身分的連線要求。
該弱點導致攻擊者劫持受害者的 Session,等於攻擊者拿到了受害者的身分,並在不知情狀況下被操作未知行為,可能造成受害者的機敏資料洩漏或交易行為變更等後果。此攻擊行為與 XSS 不同的地方在於未利用 Script 取得受害者機密資訊,而是直接利用受害者發出的連線進行操作,因此除了 Cookie 的保護外,也必須對機敏內容的連線做二次驗證,採用不信任的方式檢查。

驗證的方向需能檢驗送出連線的使用者身分,以避免受害者在不知情狀況下被冒用身分,可參考方法如下,
-
檢查 HTTP Header 欄位:可透過檢查 Header 中的 Referer 欄位是否存在及是否為正常流程網域,藉此確認發送端的前一個頁面是否被偽造或合法使用。
-
驗證 Token 參數:除了驗證 Cookie 的 Token 之外,還需另外在 Request 中放入隱藏的動態 Token 參數。
-
辨識使用者資訊:取得使用者環境資訊如 IP 位址或瀏覽器的 User-Agent,若發現經變更即驗證失效或送出重複身份驗證需求。
.NET 開發者可參考如下方法來進行:
取得 Referer 標頭 (HttpRequest.UrlReferrer / HttpWebRequest.Referer)
https://msdn.microsoft.com/zh-tw/library/system.net.httpwebrequest.referer(v=vs.110).aspx
使用 ASP .NET Core 的 Antiforgery 防範
https://docs.microsoft.com/zh-tw/aspnet/core/security/anti-request-forgery
取得使用者資訊 (User-Agent)
https://msdn.microsoft.com/zh-tw/library/system.web.httprequest.useragent(v=vs.110).aspx