代码之家  ›  专栏  ›  技术社区  ›  Andrew Hancox

如何检查URL是否可公开访问?

  •  2
  • Andrew Hancox  · 技术社区  · 15 年前

    我有一个Web应用程序,通过给它提供一个URL,您可以使用它从另一个站点导入信息。有人指出,您可以使用此功能访问托管在同一Web服务器上的私有网站。
    所以…
    如何检查给定的URL是否可以公开访问(无论是在同一个Web服务器上还是在其他地方)?

    修复: 我最终做了这件事:

        protected static bool IsHostWithinSegment(string Host)
        {
            Ping pinger = new Ping();
            string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
            byte[] buffer = Encoding.ASCII.GetBytes(data);
            PingOptions options = new PingOptions();
            options.Ttl = 1;
    
            PingReply reply = pinger.Send(Host, 1000, buffer, options);
    
            return reply.Status == IPStatus.Success;
        }
    
        private static Uri BindStringToURI(string value)
        {
            Uri uri;
            if (Uri.TryCreate(value, UriKind.Absolute, out uri))
                return uri;
    
            // Try prepending default scheme
            value = string.Format("{0}://{1}", "http", value);
            if (Uri.TryCreate(value, UriKind.Absolute, out uri))
                return uri;
    
            return null;
        }
    

    我唯一不满足的要求是,我们的产品的某些安装将彼此共存,而您将无法在它们之间导入信息-我怀疑这将需要使用代理服务器获取外部视图,但由于这不是我的项目的要求,我将把它留给其他人。

    --我刚刚意识到这完全解决了我的问题,因为所有可公开访问的URL都可以解析为虚拟或可路由的IP,这意味着它们可以跳跃。

    6 回复  |  直到 12 年前
        1
  •  1
  •   user159335    15 年前

    运行一个跟踪路由(一系列具有短TTL的ping到地址,如果防火墙是其中一个跃点,那么它在组织外部可见,因此应该是可以接受的。

    system.net.networkinformation有一个ping类,它应该为类似tracert的例程提供足够的信息。

    不过,这听起来确实像一个大洞,应该考虑另一种方法。阻止运行此程序的计算机。通过访问内部网络上的任何其他机器可能会更好-一种内部防火墙。

    我添加了一个简单的traceroute,因为您喜欢这个概念:

    class Program
    {
        static void Main(string[] args)
        {
            PingReply reply = null;
            PingOptions options = new PingOptions();
            options.DontFragment = true;
            Ping p = new Ping();
            for (int n = 1; n < 255 && (reply == null || reply.Status != IPStatus.Success); n++)
            {
                options.Ttl = n;
                reply = p.Send("www.yahoo.com", 1000, new byte[1], options);
                if (reply.Address != null)
                    Console.WriteLine(n.ToString() + " : " + reply.Address.ToString());
                else
                    Console.WriteLine(n.ToString() + " : <null>");
            }
            Console.WriteLine("Done.");
            System.Console.ReadKey();
        }
    }
    

    对于一个可靠的本地网络来说应该足够好。

        2
  •  1
  •   Dereleased    15 年前

    我只想到两件事。

    1. 让受信任的外部服务器验证地址的可见性(如HTTP代理)
    2. 检查站点上的DNS记录——如果它解析为内部的某个内容( 127.0.0.1 , 10.* , 192.168.* 等等)拒绝它——当然,这可能不起作用,这取决于内部网络的设置方式。

    不知道这是在第三方托管解决方案上还是在您/您公司的内部网络中,很难说出哪种解决方案是最好的;祝您好运。

    编辑:第二次考虑,我已经取消了第二个建议,因为它仍然会让你打开DNS重新绑定。我把这个放在这里是为了这个目的,但我不认为这是个好主意。

    也就是说,如果您有能力控制此服务器的网络组成,那么它可能生活在自己的世界中,专用的,在其专用网络上没有其他任何东西。

        3
  •  0
  •   pascal    15 年前

    检查URL地址,看看它是否与您的服务器地址匹配?

    编辑 :或检查地址范围…

    但所有这些都不能回答这个问题:客户机可以访问它吗?

    可能是浏览器中的某个脚本检查该URL是否可访问,并将结果通知服务器。 但是用户可以编辑页面,或者模拟结果…

    客户机是否读取URL内容并将其发送回服务器,而不是让服务器获取?

        4
  •  0
  •   Thomas Herlea    15 年前

    不要担心其他人的网络资产的公共可访问性,这个问题在所有情况下都没有明确的答案。只是尽量不要破坏对您自己(或客户的等)Web资产的访问策略。

    使用现有的访问控制机制来控制Web应用程序的访问。不要仅仅为了在Web应用程序中复制它们而咨询访问控制机制。这将依赖于Web应用程序来避免使用它的完全访问权——如果Web应用程序受到威胁,或者它只是在访问控制复制功能中有一个缺陷,那么这是一种错误的依赖。参见 http://en.wikipedia.org/wiki/Confused_deputy_problem .

    由于Web应用程序充当外部访问者的代理,因此如果可以,请将其视为驻留在内部网络之外。也许把它放在DMZ里。注意,我并不是说这个解决方案是网络配置,我只是说,如果访问者试图直接访问这个页面,那么这个解决方案应该处于解决方案的同一级别。

    让Web应用程序跳过外部访问者必须跳过的同一个环。让它无法访问外部访问者也无法访问的资源。提供一个错误页面,不允许外部访问者区分“找不到页面”和“拒绝访问”。

        5
  •  0
  •   Jester    12 年前

    wininet dll有一个函数 InternetCheckConnection

    好吧,看看 InternetGetConnectedState

        6
  •  -1
  •   Michael Dillon    15 年前

    你问错了问题。您应该问,我如何限制对给定URL的访问,以便只有特定网络上的人才能访问它?

    事实是,您不能以您想要的方式进行测试,因为您可能无法访问同一Web服务器上的其他站点,以便运行一个尝试检索URL的脚本。最好拒绝除您希望允许的访问之外的所有访问。

    也许防火墙可以为您做到这一点,但是如果您想要更细粒度的控制,以便某些URL是完全开放的,而其他URL是受限制的,那么您可能需要Web服务器软件的帮助,或者需要将其编码到为受限制的URL提供服务的应用程序中。

    如果您担心Web应用程序可能用于传输来自受同一防火墙保护的其他服务器的数据,则应将应用程序更改为不允许任何URL,其中URL的域名部分解析为防火墙保护范围内的IP地址。您可以从防火墙管理员处获取该地址范围信息。

    这实际上只是内部系统的一个问题,因为在第三方数据中心不应该有任何没有自己保护的私有服务器。换句话说,如果在你的公司,他们可能会期望他们的防火墙保护整个数据中心,这是合理的,如果有点风险。但是,当您从第三方租赁主机时,在Internet上有一个数据中心,您必须假设该数据中心内的所有内容与外部内容一样具有潜在的敌意。