代码之家  ›  专栏  ›  技术社区  ›  Kevin Pang

ASP.NET MVC中的返回URL

  •  30
  • Kevin Pang  · 技术社区  · 16 年前

    我的应用程序上当前有一个登录链接,如下所示:

    <a href="/login?ReturnUrl=" + <%= Request.RawUrl %>>Login</a>
    

    我想在下面的控制器操作的登录页面上处理post命令:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Login(string returnUrl)
    {
        // Authenticate user
    
        return Redirect(returnUrl);
    }
    

    这里的问题是,如果rawurl具有多个url参数,比如“somepage”?param1=1¶m2=2¶m3=3“,然后,传递到登录操作的返回URL在第一个和号后被截断:“somepage?”PARAM1=1”。

    我试过给rawurl编码,但这似乎有什么不同。这里的ASP.NET MVC框架似乎在将URL参数映射到控制器操作参数之前对其进行了url编码,最终剥离了我希望在返回URL参数中看到的其他URL参数。

    有办法解决这个问题吗?我知道我可以只使用request.path并解析出我需要的值,但我想先看看是否有更干净的方法。

    3 回复  |  直到 15 年前
        1
  •  38
  •   Craig Stuntz    16 年前

    您可能对链接的编码不正确。是的,它们确实需要编码。我们是这样做的:

    <a href="<%= Url.Action("Delete", "TimeRecord", 
        new RouteValueDictionary(new { id = timeRecord.AltId, 
        returnUrl=ViewContext.HttpContext.Request.Url.PathAndQuery }) ) %>">
    
        2
  •  8
  •   Nick Berardi    15 年前

    在使用之前,请确保URL对rawurl进行了编码。

    <%= Url.Encode(Request.RawUrl) %>
    

    这应该对你有用。

        3
  •  -2
  •   Will    16 年前

    好吧,你的解决方案有一股味道;我无法将手指放在描述攻击的链接上(它可能是某种类型的会话劫持),但通过查询字符串盲目重定向必须是一个安全漏洞。请有人回答或评论信息。

    如果不考虑这方面的安全性,一个快速的解决方案是对整个返回URL进行base64编码。这是一些我完全从中得到的代码 a blog 可能工作,也可能不工作:

    public static string ToBase64(this HtmlHelper me, string toEncode)
    {
          byte[] toEncodeAsBytes
                = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
          string returnValue
                = System.Convert.ToBase64String(toEncodeAsBytes);
          return returnValue;
    }
    
    public static string FromBase64(this HtmlHelper me, string encodedData)
    {
          byte[] encodedDataAsBytes
              = System.Convert.FromBase64String(encodedData);
          string returnValue =
             System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes);
          return returnValue;
    }