【问题标题】:ReturnUrl in ASP.NET MVCASP.NET MVC 中的 ReturnUrl
【发布时间】:2009-04-22 18:42:35
【问题描述】:

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

<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&param2=2&param3=3”,那么传递给 Login 操作的 returnUrl 在第一个 & 符号之后被截断:“somepage?param1 =1"。

我已尝试对 RawUrl 进行 UrlEncoding,但这似乎有所不同。似乎这里的 ASP.NET MVC 框架是在将 url 参数映射到控制器操作参数之前对它们进行 UrlDecoding,这最终剥离了我想在我的 returnUrl 参数中看到的其他 url 参数。

有没有办法解决这个问题?我知道我可以只使用 Request.Path 并解析出我需要的值,但我想我会先看看是否有更清洁的方法。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    您可能错误地对链接进行了编码。是的,它们确实需要编码。以下是我们的做法:

    <a href="<%= Url.Action("Delete", "TimeRecord", 
        new RouteValueDictionary(new { id = timeRecord.AltId, 
        returnUrl=ViewContext.HttpContext.Request.Url.PathAndQuery }) ) %>">
    

    【讨论】:

    • 这很好; PathAndQuery 不包含域,因此您不会受到攻击者使用您的服务器重定向到他们的站点的攻击。
    • 我不会说你不脆弱。人们可以使用 Fiddler 等来更改表单数据。您仍然必须在服务器上清理 URI。另一方面,最好不要用坏数据预先填充表单。 :)
    • 看起来不错。请注意,ViewContext.HttpContext.Request.Url 可以返回 null,这意味着您可能有一个 NullReferenceException
    • 这不是这个问题的正确答案。正确答案是使用Url.Encode(Request.RawUrl)
    【解决方案2】:

    确保在使用 RawUrl 之前对其进行 URL 编码。

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

    这应该为你做。

    【讨论】:

    • 这很好用,原来的帖子错误地分析了正在发生的事情。
    猜你喜欢
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2016-09-22
    相关资源
    最近更新 更多