asp.net mvc中Html.AntiForgeryToken()可以防止跨站请求伪造攻击,它跟XSS(XSS又叫CSS:Cross-Site-Script),攻击不同,XSS一般是利用站内信任的用户在网站内插入恶意的脚本代码进行攻击,而CSRF则是伪造成受信任用户对网站进行攻击。
举个简单例子,譬如整个系统的公告在网站首页显示,而这个公告是从后台提交的,我用最简单的写法:
网站后台(Home/Index页面)设置首页公告内容,提交到HomeController的Text Action
1 | @using (Html.BeginForm( "Text" , "Home" ,FormMethod.Post)) { @:输入信息:<input type= "text" name= "Notice" id= "Notice" /> <input type= "submit" value= "Submit" /> } HomeController的Text Action[HttpPost] public ActionResult Text() { ViewBag.Notice = Request.Form[ "Notice" ].ToString(); return View(); }
|
Copy after login
填写完公告,提交,显示
此时提供给了跨站攻击的漏洞,CSRF一般依赖几个条件
(1)攻击者了解受害者所在的站点
(2)攻击者的目标站点具有持久化授权cookie或者受害者具有当前会话cookie
(3)目标站点没有对用户在网站行为的第二授权此时
现在我们来开始模拟跨站请求,假设请求地址是http://localhost:25873/Home/Text,且也满足2,3的情况。
于是我新建一个AntiForgeryText.html文件,内容如下
1 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > <html xmlns= "http://www.w3.org/1999/xhtml" > <head> <title></title> </head> <body> <form name= "badform" method= "post" action= "http://localhost:6060/Home/Text" > <input type= "hidden" name= "Notice" id= "Notice" value= "你的网站被我黑了。。" /> <input type= "submit" value= "黑掉这个网站" /> </form> </body> </html>
|
Copy after login
在这个html中加了一个隐藏的字段,Name和Id和网站要接收的参数名一样。
我点击了“黑掉这个网站”,呈现如下
这个就是利用了漏洞把首页的公告给改了,这就是一个简单的跨站攻击的例子。
MVC中通过在页面上使用 Html.AntiForgeryToken()配合在对应的Action上增加[ValidateAntiForgeryToken]特性来防止跨站攻击。
把上面的代码改成
1 | @using (Html.BeginForm( "Text" , "Home" ,FormMethod.Post)) { @Html.AntiForgeryToken() @:网站公告:<input type= "text" name= "Notice" id= "Notice" /> <input type= "submit" value= "Submit" /> } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Text() { ViewBag.Notice = Request.Form[ "Notice" ].ToString(); return View(); }
|
Copy after login
这样子我在AntiForgeryText.html中点"黑掉这个网站",再次发出请求
这就成功的防止了跨站攻击
参考资料:asp.net mvc中的@Html.AntiForgeryToken()防止跨站攻击http://www.ourcodelife.com/thread-49179-1-1.html