2014-10-29 56 views

回答

22

簡短版本是生成的令牌存儲在2個地方:(a)cookie(b)隱藏的表單值。當提交表格時,這兩個值相互比較以確定它們是否有效。進一步閱讀:

http://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-(csrf)-attacks http://www.codeproject.com/Articles/793384/ASP-NET-Anti-Forgery-Tokens-internals

+2

實際上會生成兩個令牌。不只是一個存儲在兩個地方。 – 2017-06-26 12:59:15

5

一個階梯式的解釋比接受的答案恕我直言更清晰(從https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/preventing-cross-site-request-forgery-csrf-attacks

  1. 客戶端請求包含一個表單的HTML頁面。
  2. 服務器在響應中包含兩個令牌。一個令牌作爲cookie發送。另一個放置在隱藏的表單字段中。令牌是隨機生成的,因此對手無法猜測值。
  3. 當客戶端提交表單時,它必須將兩個令牌都發送回服務器。客戶端將cookie標記作爲cookie發送,並在表單數據內發送表單標記。 (瀏覽器客戶端在用戶提交表單時自動執行此操作。)
  4. 如果請求不包括這兩個標記,則服務器將禁止該請求。
0

上面的描述是不是所有的東西做,在AjaxRequest的情況下,防僞,特別是在GET請求,通常不會與比較隱蔽值發送表單,而不是你需要設置一個標頭值與JavaScript的相同的內容通過JavaScript ..你應該設置的標題名稱是默認的X-XRF-Token標頭[與angularjs有關] ...當然,你需要禁用CORS或只爲特定域啓用它爲了保護API,SAMEORIGIN也需要設置爲避免點擊劫持。