CSRF(Cross-site request forgery)利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求自己是用户自愿发出的。html
在某个论坛管理页面,管理员能够在list页面执行删除帖子操做,根据URL判断删除帖子的id,像这样的一个URLweb
http://localhost/list?action=delete&id=12
当恶意用户向管理员发送包含CSRF的邮件,骗取管理员访问http://test.com/csrf,在这个恶意网页中只要包含这样的html语句就能够利用让管理员在不知情的状况下删除帖子了浏览器
<img alt="" arc="http://localhost/list?action=delete&id=12"/>
这种恶意的网址能够有不少种形式,藏身于网页中的许多地方。此外,攻击者也不须要控制放置恶意网址的网站。例如他能够将这种地址藏在论坛,博客等任何用户生成内容的网站中。这意味着若是服务端没有合适的防护措施的话,用户即便访问熟悉的可信网站也有受攻击的危险。post
透过例子可以看出,攻击者并不能经过CSRF攻击来直接获取用户的帐户控制权,也不能直接窃取用户的任何信息。他们能作到的,是欺骗用户浏览器,让其以用户的名义运行操做。网站
ASP.NET Core中提供了防伪造令牌,这样的令牌须要从用户应该使用的表单中建立,以输入有效数据,并在接受数据时进行验证。code
<form asp-controller="Home" asp-action="Edit" method="post"> @Html.AntiForgeryToken() <input type="text" /> <input type="text" /> <input type="submit" value="Submit" /> </form>
运行应用程序时,能够看到一个隐藏的表单字段,其中包含自动生成的令牌。当检索这个数据时,使用ValidateAntiForgeryToken属性对标记进行验证。orm
[HttpPost] [ValidateAntiForgeryToken] public IActionResult Edit(EditModel model) => View("EditResult", model);