MVC中的属性常用于一些HttpPost类型的Action,比如在ASP.net MVC sample中,login就用了这个属性

View Code
       //
        // POST: /Account/Login

        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public ActionResult Login(LoginModel model, string returnUrl)
        {
            if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
            {
                return RedirectToLocal(returnUrl);
            }

            // 如果我们进行到这一步时某个地方出错,则重新显示表单
            ModelState.AddModelError("", "提供的用户名或密码不正确。");
            return View(model);
        }

这个属性干什么的呢?

当符合以下三种条件时,

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

 

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

 

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

比如我要攻击一个存在问题的blog,那就先去目标blog留言,留下一个网址,诱其主人点击过来(这个就要看你的忽悠本事咯:p),然后构造个HTML表单(该表单中的目标地址及表单元素及名称与该网站本身的提交页面完全一致)提交些数据过去,这样就借助该受害者本身的身份验证cookie实现了对其网站的一个攻击。

类似这样:

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

但加了ValidateAntiForgeryToken属性以后,客户端代码会增加一项值很长的hiddenfield,该值每次刷新页面都会由服务端生成一个新的随机值,且该值同时存在于客户端本地的cookie和Form表单的hiddenfield中,当服务端收到post请求时,会比较这两个值是否相同,相同才会继续处理,不同则会报错,从而有效阻止了以上的这种伪造请求攻击,因为伪造的页面中不可能有这一长串值。

 

View Code
 1 <form action="/Account/Login?ReturnUrl=%2FGuestBook%2FCreate" method="post"><input name="__RequestVerificationToken" type="hidden" value="rHMjZNFCmLrHjUNE1aWMeMQilWDx0N7j_qimJqBIElkpFzJhRNDynQXWEqy-HLJjklPeJVCXmKITBaRkGlllwPags4xajrVNnLmt7ntYmGwcZDk7oskDyVweo1S5YMWZkILpGIYUoVFJ3a1W1I2xv4Z2ZFGEIsZC6GfOF72FFe01" />    <fieldset>
 2         <legend>“登录”表单</legend>
 3         <ol>
 4             <li>
 5                 <label for="UserName">用户名</label>
 6                 <input data-val="true" data-val-required="用户名 字段是必需的。" id="UserName" name="UserName" type="text" value="" />
 7                 <span class="field-validation-valid" data-valmsg-for="UserName" data-valmsg-replace="true"></span>
 8             </li>
 9             <li>
10                 <label for="Password">密码</label>
11                 <input data-val="true" data-val-required="密码 字段是必需的。" id="Password" name="Password" type="password" />
12                 <span class="field-validation-valid" data-valmsg-for="Password" data-valmsg-replace="true"></span>
13             </li>
14             <li>
15                 <input data-val="true" data-val-required="记住我? 字段是必需的。" id="RememberMe" name="RememberMe" type="checkbox" value="true" /><input name="RememberMe" type="hidden" value="false" />
16                 <label class="checkbox" for="RememberMe">记住我?</label>
17             </li>
18         </ol>
19         <input type="submit" value="登录" />
20     </fieldset>
21     <p>
22         <a href="/Account/Register">Register</a> (如果你没有帐户)。
23     </p>
24 </form>

 

参见:http://www.cnblogs.com/dragon_mail/archive/2011/07/10/2102364.html

 

posted on 2013-05-07 17:53  赶路人之刚出发  阅读(1351)  评论(0编辑  收藏  举报