Actualmente tengo un enlace de conexión en mi aplicación que se ve algo como esto:ReturnUrl en ASP.NET MVC
<a href="/login?ReturnUrl=" + <%= Request.RawUrl %>>Login</a>
quiero manejar el comando POST en la página de inicio de sesión en el controlador de la acción a continuación:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Login(string returnUrl)
{
// Authenticate user
return Redirect(returnUrl);
}
el problema aquí es si el RawUrl es algo con varios parámetros de URL como "CiertaPágina? param1 = 1 & param2 = 2 & param3 = 3", entonces el ReturnURL que se pasa a la acción de acceso se trunca después de la primera ampersand: "somepage? p aram1 = 1 ".
He intentado con UrlEncoding the RawUrl, pero eso parece marcar la diferencia. Parece que el marco MVC de ASP.NET aquí es UrlDecoding los parámetros de URL antes de asignarlos a los parámetros de acción del controlador, lo que termina eliminando los parámetros de URL adicionales que quiero ver en mi parámetro returnUrl.
¿Hay alguna forma de evitar esto? Sé que podría usar Request.Path y analizar los valores que necesito, pero pensé que primero vería si había un enfoque más limpio.
Esto es bueno; PathAndQuery no incluye el dominio, por lo que no es vulnerable a que un atacante use su servidor para redirigirlo a su sitio. – Will
No diría que no eres vulnerable. La gente puede cambiar los datos del formulario con Fiddler y similares. Aún debe desinfectar el URI en el servidor. Por otro lado, es bueno no rellenar el formulario con datos incorrectos. :) –
Se ve bien. Sin embargo, ten en cuenta que 'ViewContext.HttpContext.Request.Url' puede devolver nulo, lo que significa que puedes tener' NullReferenceException'. –