【问题标题】:how does ASP.NET validate anti-forgery tokenASP.NET 如何验证防伪令牌
【发布时间】:2014-10-29 00:01:53
【问题描述】:

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

【问题讨论】:

标签: asp.net security xss antiforgerytoken


【解决方案1】:

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

【讨论】:

  • 实际上生成了两个token。不仅仅是存储在两个地方的一个。
【解决方案2】:

比接受的答案更清楚的逐步解释恕我直言(来自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. 如果请求不包含两个令牌,服务器将拒绝该请求。

【讨论】:

  • “服务器不允许请求”是怎么回事?
  • 它不会给出请求的响应,而是一个http错误代码。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2021-06-09
    • 2014-01-23
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 2018-07-11
    • 2018-06-19
    • 1970-01-01
    相关资源
    最近更新 更多