ASP.NET 中开放重定向问题

在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);
        }
原文地址:https://www.cnblogs.com/FlyCat/p/2635485.html