在url中带returnurl可以方便的重定向到原请求页面,但是链接可能会被修改,可能会跳到精心设计的钓鱼网页,并显示密码错误,需要再次输入密码,如果输入密码,密码就会泄露。
解决这个问题,需要在重定向前检测重定向页面是否合法
ASP.NET中的解决方法,编写如下扩展类
View Code
public static class RequestExtensions { public static bool IsUrlLocalToHost(this HttpRequest request, string url) { if (String.IsNullOrEmpty(url)) { return false; } Uri absoluteUri; if (Uri.TryCreate(url, UriKind.Absolute, out absoluteUri)) { return String.Equals(request.Url.Host, absoluteUri.Host, StringComparison.OrdinalIgnoreCase); } else { bool isLocal = !url.StartsWith("http:", StringComparison.OrdinalIgnoreCase) && !url.StartsWith("https:", StringComparison.OrdinalIgnoreCase) && Uri.IsWellFormedUriString(url, UriKind.Relative); return isLocal; } }
调用方法:
View Code
public static void RedirectToReturnUrl(this HttpContext context) { string url = @"~/Default.aspx"; if (context.Request["returnurl"] != null) { string temp =HttpUtility.UrlDecode(context.Request["returnurl"]); //判断是否是合法路径 if(context.Request.IsUrlLocalToHost(temp)) url = temp; } context.Response.Redirect(url); }