Подтвердить что ты не робот

ReturnUrl в ASP.NET MVC

В настоящее время у меня есть ссылка для входа в приложение, которая выглядит примерно так:

<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", тогда возвращаемый url, который передается в действие Login, усекается после первого амперсанда: "somepage? param1 = 1".

Я пробовал UrlEncoding RawUrl, но, похоже, имеет значение. Кажется, что инфраструктура ASP.NET MVC здесь UrlDecoding params url, прежде чем сопоставлять их с параметрами действия контроллера, что заканчивает отмену дополнительных параметров url, которые я хочу увидеть в моем параметре returnUrl.

Есть ли способ обойти это? Я знаю, что могу просто использовать Request.Path и проанализировать нужные мне значения, но я подумал, что сначала посмотрю, был ли более чистый подход.

4b9b3361

Ответ 1

Вероятно, вы неправильно кодируете ссылки. Да, они должны быть закодированы. Вот как мы это делаем:

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

Ответ 2

Перед использованием убедитесь, что URL-адрес закодирован RawUrl.

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

Это должно сделать это за вас.

Ответ 3

Хорошо, ваше решение имеет запах; Я не могу поместить палец на ссылку, описывающую атаку (она должна быть какой-то захватной сессией), но слепо перенаправление через querystring имеет GOT, чтобы быть дырой в безопасности. Кто-то отвечает или комментирует информацию, PLS.

Не задумываясь об аспекте безопасности, одним быстрым решением будет Base64 кодировать весь URL-адрес возврата. Здесь некоторый код, который я полностью скрывал от блог, который может работать или не работать:

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;
}