ASP.NET如何验证防伪令牌

时间:2014-10-29 00:01:54

标签: asp.net security xss antiforgerytoken

我想知道ASP.NET如何检查防伪令牌是否有效?像存储这些令牌的ASP.NET在哪里?它们是如何存储的?

3 个答案:

答案 0 :(得分:25)

简短版本是生成的令牌存储在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

答案 1 :(得分:11)

逐步解释比接受的答案imho(来自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. 如果请求不包含这两个令牌,则服务器不允许该请求。

答案 2 :(得分:2)

上面的描述并不是全部所做的,在AjaxRequest的情况下,反伪造,特别是在get请求中,通常不会发送带有隐藏值的Form进行比较,而是需要设置一个具有相同的头值。通过javascript的cookie的内容..您应该设置的标题名称默认为X-XRF-Token标头[与angularjs相关] ...当然,您需要禁用CORS或仅为特定域启用它以保护API,SAMEORIGIN也需要设置以避免点击劫持..