aspnet mvc使用@Html.AntiForgeryToken()防止跨站攻击

asp.net mvc中Html.AntiForgeryToken()可以防止跨站请求伪造攻击,它跟XSS(XSS又叫CSS:Cross-Site-Script),攻击不同,XSS一般是利用站内信任的用户在网站内插入恶意的脚本代码进行攻击,而CSRF则是伪造成受信任用户对网站进行攻击。

举个简单例子,譬如整个系统的公告在网站首页显示,而这个公告是从后台提交的,我用最简单的写法:

网站后台(Home/Index页面)设置首页公告内容,提交到HomeController的Text Action

@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();  
}



填写完公告,提交,显示
 

此时提供给了跨站攻击的漏洞,CSRF一般依赖几个条件

(1)攻击者了解受害者所在的站点

(2)攻击者的目标站点具有持久化授权cookie或者受害者具有当前会话cookie

(3)目标站点没有对用户在网站行为的第二授权此时


现在我们来开始模拟跨站请求,假设请求地址是http://localhost:25873/Home/Text,且也满足2,3的情况。

于是我新建一个AntiForgeryText.html文件,内容如下

<!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>


在这个html中加了一个隐藏的字段,Name和Id和网站要接收的参数名一样。

我点击了“黑掉这个网站”,呈现如下
aspnet mvc使用@Html.AntiForgeryToken()防止跨站攻击_第1张图片 

这个就是利用了漏洞把首页的公告给改了,这就是一个简单的跨站攻击的例子。



MVC中通过在页面上使用 Html.AntiForgeryToken()配合在对应的Action上增加[ValidateAntiForgeryToken]特性来防止跨站攻击。

把上面的代码改成

@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();  
}


这样子我在AntiForgeryText.html中点"黑掉这个网站",再次发出请求
aspnet mvc使用@Html.AntiForgeryToken()防止跨站攻击_第2张图片 

这就成功的防止了跨站攻击

参考资料:asp.net mvc中的@Html.AntiForgeryToken()防止跨站攻击http://www.ourcodelife.com/thread-49179-1-1.html

你可能感兴趣的:(mvc,ASPNET)