ASP.NET MVC AntiForgeryToken

时间:2020-12-24 21:05:39

你开发一个网站,其中有个功能:新闻发布。

你是这样实现的:

1.保存新闻的方法是:/News/Save  POST提交

2.接受两个参数:title和content

有一天,你登录网站(浏览器会保存相关cookie),发布了一条新闻,发布成功。

然后打开了NSFW网站(你站点的相关cookie还在),这个网站等你很久了,他知道你的新闻发布功能的实现,于是在页面中嵌入一段脚本,模拟参数,请求你的保存方法。当然,还带着你的站点的cookie。

你的程序代码当然的处理成功了,所以一条新闻就发布成功了。而整个过程,你还懵逼着。

这个就是CSRF。Cross-site request forgery的缩写,中文名称叫跨站请求伪造。

名词很高大上,写在PPT里忽悠几句还能拿个风投。但简单理解就是:攻击者盗用了你的身份,以你的名义发送恶意请求。

重点在“伪造”,如果你能保证你访问每一个网站,都清除上个网站的痕迹的话,你就可以避免此攻击。但是,可能吗?NO!

所以,要在程序层面进行防御,重点是让攻击者无法伪造

ASP.NET MVC的做法是:Html.AntiForgeryToken()

会在页面上生成这样一个隐藏域:

ASP.NET MVC AntiForgeryToken

提交到服务端,使用ValidateAntiForgeryToken特性验证:

ASP.NET MVC AntiForgeryToken

如果服务端请求中没有__RequestVerificationToken参数:

ASP.NET MVC AntiForgeryToken

或者参数的值不一致:

ASP.NET MVC AntiForgeryToken

这样,就能很大程度上防止伪造,进行CSRF攻击了。