ASP.NET如何验证防伪标记?

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

这是 .NET 5.0 的解释:https://levelup.gitconnected.com/antiforgery-tokens-behind-the-scenes-dcddda54db8a - David Klempfner
3个回答

30

7
实际上会生成两个 token,而不仅是一个 token 存储在两个位置。 - chtenb

18

我认为比起被接受的答案,以下是更加清晰易懂的步骤解释(来源于https://learn.microsoft.com/en-us/aspnet/web-api/overview/security/preventing-cross-site-request-forgery-csrf-attacks

  1. 客户端请求包含表单的HTML页面。
  2. 服务器在响应中包含两个令牌。其中一个令牌作为cookie发送,另一个放置在隐藏的表单字段中。这些令牌是随机生成的,以便攻击者无法猜测其值。
  3. 当客户端提交表单时,必须将两个令牌都发送回服务器。客户端将cookie令牌作为cookie发送,并将表单令牌发送到表单数据中。(当用户提交表单时,浏览器客户端会自动执行此操作。)
  4. 如果请求不包括两个令牌,则服务器将拒绝该请求。

1
"服务器如何禁止请求?" - liang
它不会给出请求的响应,而是返回一个HTTP错误代码。 - chtenb
CSRF 假定攻击者拥有用户的访问令牌。那么什么会阻止他请求该 HTML 页面,获取反跨站点伪造令牌并提交表单呢?这没有道理。 - robino16

4
上述描述并不是全部内容,在AjaxRequest中,特别是在get请求中,防伪功能通常不会将带有隐藏值的表单发送进行比较,而是需要通过javascript设置与cookie相同的内容的标头值。应该设置的标头名称默认为X-XRF-Token标头[涉及angularjs]...当然,您需要禁用CORS或仅针对特定域启用它以保护API,SAMEORIGIN也需要设置以避免点击劫持。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接