diff --git a/src/Orchard/Mvc/Extensions/ControllerExtensions.cs b/src/Orchard/Mvc/Extensions/ControllerExtensions.cs index db4e2c201..84a3bd106 100644 --- a/src/Orchard/Mvc/Extensions/ControllerExtensions.cs +++ b/src/Orchard/Mvc/Extensions/ControllerExtensions.cs @@ -4,28 +4,14 @@ using System.Web.Mvc; namespace Orchard.Mvc.Extensions { public static class ControllerExtensions { public static RedirectResult ReturnUrlRedirect(this Controller controller) { - var request = controller.HttpContext.Request; - Uri returnUrl = null; - try { - returnUrl = new Uri(request.QueryString["ReturnUrl"]); - } - catch { - try { - returnUrl = - new Uri(string.Format("{0}://{1}{2}{3}", request.Url.Scheme, request.Url.Host, - request.Url.Port != 80 ? ":" + request.Url.Port : "", - request.QueryString["ReturnUrl"])); - } - catch { } + string returnUrl = controller.Request.QueryString["ReturnUrl"]; + + // prevents phishing attacks by using only relative urls + if(!returnUrl.StartsWith("/")) { + return new RedirectResult("~/"); } - if (returnUrl != null && - returnUrl.Scheme == request.Url.Scheme && - returnUrl.Port == request.Url.Port && - returnUrl.Host == request.Url.Host) { - return new RedirectResult(returnUrl.ToString()); - } - return new RedirectResult("~/"); + return new RedirectResult(returnUrl); } } }