当我阅读 ASP.NET MVC 实现的防伪系统生成一个可以在同一会话中重用的令牌时,我的问题是为什么每次我在我的应用程序中生成一个新表单时这个令牌都会改变?我说的是隐藏输入字段,而不是 cookie 值。
谢谢。
当我阅读 ASP.NET MVC 实现的防伪系统生成一个可以在同一会话中重用的令牌时,我的问题是为什么每次我在我的应用程序中生成一个新表单时这个令牌都会改变?我说的是隐藏输入字段,而不是 cookie 值。
谢谢。
不,令牌不会被重复使用。
每次页面刷新都会在表单输入中生成一个新值(以及 Cookie,以防它无效或不存在)。提交后,服务器将尝试将表单值与 Cookie 值进行匹配。
取自 Professional ASP.NET.MVC 3 book
令牌验证 ASP.NET MVC 包含一种防止 CSRF 攻击的好方法,它的工作原理是验证向您的站点提交数据的用户是否愿意这样做。最简单的方法是将隐藏输入嵌入到每个包含唯一值的表单请求中。您可以使用 HTML Helpers 执行此操作,方法是将其包含在每个表单中:
<form action=”/account/register”
> method=”post”> <@Html.AntiForgeryToken()> … </form>
Html.AntiForgeryToken 将输出一个加密值作为隐藏输入:该值将匹配作为会话 cookie 存储在用户浏览器中的另一个值。发布表单时,将使用 ActionFilter 匹配这些值:
[ValidateAntiforgeryToken] public ActionResult
> Register(…)