日期:2014-05-16  浏览次数:21009 次

ASP.NET MVC的跳转攻击问题
在ASP.NET MVC的自带的模板代码中,有这样一段,用来拦截非登录用户,使其跳转到登录页面,然后登录后在跳转回原页面。所以,期间有一个returnUrl参数用来保存原页面地址。在Login Action中,
public ActionResult Login(LogOnModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                RegisteredUser usr = RegisteredUserBLL.AuthenticateUser(model.UserName, model.Password);
                if (usr != null)
                {
                    FormsAuthentication.SetAuthCookie(model.UserName + "|" + usr.RealName + "|" + usr.UserType, model.RememberMe);  
                    if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                        && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))        ///为什么这么写????
                        return Redirect(returnUrl);                
                    return RedirectToAction("Index", "Home");      

                }
                ModelState.AddModelError("", "登录账号或密码不正确");  //
            }
            return View(model);
        }

Url.IsLocalUrl(returnUrl)用于避免跳转攻击。攻击者伪造一个看起来指向你的网站的链接,诱使用户点击,点击后,跳转到他的钓鱼网站上,而用户无法察觉。甚至,攻击者可以产生一个跨站攻击(xss),将用户cookie提交给他的网站,导致用户隐私泄露。

使用这个方法,可以判断这个URL是否指向本地网站,还是指向另一个网站。举一个例子,比如工商银行的登录问题,工行的网站叫 www.icbc.com.cn,有人仿造建立了一个网站叫 www.icbc888.cn,伪造网站看起来和工行的网站一样。并且在论坛上发布这样一个帖子:快来啊,工商银行派发红包啦,点这里:http://www.icbc.com.cn/account/login?returnUrl=www.icbc888.cn。用户看起来会觉得这个链接是工商银行的,但是当它点进去以后,会被跳转到www.icbc888.cn,后面的事情你可以想象到。