我目前在我的应用程序上有一个登录链接,如下所示:
<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&amp; param2 = 2&amp; param3 = 3”,那么传递给Login操作的returnUrl会在第一个&符后被截断: “SomePage的?参数1 = 1”。
我尝试过UrlEncoding RawUrl,但这似乎有所不同。看来这里的ASP.NET MVC框架是UrlDecoding url params,然后将它们映射到控制器动作参数,最终剥离了我想在returnUrl参数中看到的额外url参数。
这有什么办法吗?我知道我可以使用Request.Path并解析出我需要的值,但我想我会先看看是否有更清洁的方法。
答案 0 :(得分:38)
您可能错误地编码了链接。是的,它们确实需要编码。我们是这样做的:
<a href="<%= Url.Action("Delete", "TimeRecord",
new RouteValueDictionary(new { id = timeRecord.AltId,
returnUrl=ViewContext.HttpContext.Request.Url.PathAndQuery }) ) %>">
答案 1 :(得分:8)
确保在使用之前对RawUrl进行URL编码。
<%= Url.Encode(Request.RawUrl) %>
这应该为你做。
答案 2 :(得分:-2)
好的,你的解决方案有味道;我无法将手指放在描述攻击的链接上(它必须是某种类型的会话劫持),但盲目地通过查询字符串重定向会使GOT成为安全漏洞。有人回复或评论信息,请等。
不考虑这方面的安全性方面,一个快速的解决方案是Base64编码整个返回URL。以下是我完全从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;
}