我一直试图了解防伪工作的确切方式 . 令我困惑的是创建的cookie . 据我所知,您在表单中包含防伪令牌,然后在请求时验证该令牌 . 这样,如果第三方网站发布到您的网站,它将被拒绝 .
现在,我正在这里阅读https://docs.microsoft.com/en-us/aspnet/core/security/anti-request-forgery?view=aspnetcore-2.1,反伪造令牌存储在一个cookie中,也许我认为这不是为了让你的网站外可以访问这个值吗?如果我查看我的 Cookies ,我可以看到他们名字中使用防伪剂创建的3个 Cookies .
services.AddAntiforgery(options =>
{
options.CookieDomain = "contoso.com";
options.CookieName = "X-CSRF-TOKEN-COOKIENAME";
options.CookiePath = "Path";
options.FormFieldName = "AntiforgeryFieldname";
options.HeaderName = "X-CSRF-TOKEN-HEADERNAME";
options.RequireSsl = false;
options.SuppressXFrameOptionsHeader = false;
});
我做了一点测试,我创建了一个帖子表格,最后包括防伪标记然后我尝试提交它并且它有效 . 然后我创建了另一个没有令牌的表单然后失败了 . 所以对我而言,似乎只查找表单中传递的令牌,然后是什么cookie?
2 回答
防伪是一个由两部分组成的过程 . 生成页面时,令牌将作为表单的一部分包含在内,以便与其他数据一起发布 . 为客户端设置cookie . 当发布帖子时,客户端发送带有帖子数据(包括令牌)的请求,并将cookie发送回服务器,服务器也包括令牌 . 在服务器端,发布的令牌与cookie令牌匹配,如果两者不匹配则拒绝 .
这可能看起来很奇怪,因为客户端都发布了这两个,但cookie部分确保获取该页面的同一客户端也是发回它的同一客户端 . 目标不是保护防伪令牌,而是确保您网站上的页面是提交的页面,而不是某些骗子重新创建的页面版本 . 由于第三方无法为您的域设置cookie,因此他们无法伪造支票的这一部分,即使他们能够通过请求并解析令牌从页面中检索有效令牌 .
来自asp.net核心网站AntiforgeryOptions.Cookie Property . 只有在使用基于cookie的身份验证时,才需要CSRF的cookie部分 .