30 votes

ReturnUrl dans ASP.NET MVC

J'ai actuellement un lien de connexion sur mon application qui ressemble à quelque chose comme ceci:

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

Je veux gérer le POSTE de commande sur la page de connexion du contrôleur de l'action ci-dessous:

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

    return Redirect(returnUrl);
}

Le problème ici est de savoir si la RawUrl est quelque chose avec de multiples paramètres d'url "somepage?param1=1&param2=2&param3=3", puis le returnUrl qui est passée dans l'action Login est tronqué après le premier esperluette: "somepage?param1=1".

J'ai essayé d'Encodage de la RawUrl mais qui semblent ne faire aucune différence. Il semble que l'ASP.NET framework MVC ici est UrlDecoding l'url params avant leur mise en correspondance du contrôleur paramètres de l'action, qui se dépouillant de l'ajout de paramètres d'url que je veux voir dans mon returnUrl paramètre.

Est-il un moyen de contourner cela? Je sais que je pouvais Demander.Chemin d'accès et d'analyser les valeurs dont j'ai besoin, mais je pensais que je voudrais voir s'il y avait un nettoyeur de la première approche.

38voto

Craig Stuntz Points 95965

Vous encodez probablement mal les liens. Oui, ils doivent être encodés. Voici comment nous procédons:

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

8voto

Nick Berardi Points 31361

Assurez-vous que votre URL code le RawUrl avant de l'utiliser.

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

Cela devrait le faire pour vous.

-2voto

Will Points 76760

Ok, votre solution a une odeur à elle; je ne peux pas mettre mon doigt sur un lien qui décrit l'attaque (sa dois être une session de détourner de quelque sorte), mais aveuglément rediriger via une querystring a OBTENU d'être un trou de sécurité. Quelqu'un a une réponse ou un commentaire avec l'information, les pls.

Sans penser à l'aspect "sécurité" de ce, une solution rapide serait d'encoder en Base64 l'intégralité de l'url de retour. Voici un code que j'ai complètement ganked à partir d' un blog qui peut ou peut ne pas fonctionner:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X