Url


不清楚下面句话,为什么这么写?   谢谢
        
if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                        && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))完整代码        [HttpPost]
        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);
        }

解决方案 »

  1.   

    IsLocalUrl 用于避免跳转攻击。攻击者伪造一个看起来指向你的网站的链接,诱使用户点击,点击后,跳转到他的钓鱼网站上,而用户无法察觉。甚至,攻击者可以产生一个跨站攻击(xss),将用户cookie提交给他的网站,导致用户隐私泄露。使用这个方法,可以判断这个URL是否指向本地网站,还是指向另一个网站。具体参考:http://www.asp.net/mvc/tutorials/security/preventing-open-redirection-attacks
      

  2.   

    我举一个例子,比如你是工商银行,我是一个罪犯。
    你的网站叫 www.icbc.com.cn,我建立了一个网站叫 www.icbc888.cn,我让网站看起来和你的一样。
    我在论坛上发布这样一个帖子:
    快来啊,工商银行派发红包啦,点这里:http://www.icbc.com.cn/account/login?returnUrl=www.icbc888.cn。用户看起来会觉得这个链接是工商银行的,但是当它点进去以后,会被跳转到www.icbc888.cn,后面的事情你可以想象到。
      

  3.   

      奇怪了,我这vs2010mvc中没有这个方法Url.IsLocalUrl
      

  4.   

    但是在mvc中,他上面的这句
    if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                            && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))        ///为什么这么写????
                            return Redirect(returnUrl);  不要的话,就算是这样也不会执行跳转啊