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

时间:2009-11-04 11:17:37

标签: c# .net security url dns

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

FIX: 我最终这样做了:

    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;
    }

我唯一不满足的要求是我们产品的某些安装将彼此并存,您将无法在它们之间导入信息 - 我怀疑这需要使用代理服务器来获取事情的极端观点,但由于这不是我的项目的要求,我会留给别人。

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

6 个答案:

答案 0 :(得分:1)

只有两件事情浮现在脑海中。

  1. 让受信任的外部服务器验证地址的可见性(如HTTP代理)
  2. 检查网站上的DNS记录 - 如果它解析为内部(127.0.0.110.*192.168.*等),拒绝它 - 当然,这可能不起作用,具体取决于您的内部网络的设置方式
  3. 不知道这是在第三方托管解决方案上还是在您/您公司的内部网络内部,这使得很难说哪种解决方案最好;祝你好运。

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

    也就是说,如果你有能力控制这台服务器的网络构成,那么它应该可以存在于自己的世界中,专用于其专用网络上的其他内容。

答案 1 :(得分:1)

运行traceroute(一系列具有短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 :(得分:0)

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

修改:或检查一系列地址......

但这一切都没有回答这个问题:客户可以访问它吗?

可能浏览器中有一些脚本检查网址是否可访问,并通知服务器结果。 但是用户可以编辑页面,或模拟结果......

让客户端读取url内容并将其发送回服务器,而不是让服务器获取它吗?

答案 3 :(得分:0)

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

使用现有的访问控制机制来控制Web应用程序的访问。不要只是参考访问控制机制,以便在Web应用程序中复制它们。这将依赖于Web应用程序以避免使用其完全访问权限 - 如果Web应用程序遭到入侵或者它只是在访问控制重复功能中存在错误,则会出现错误依赖。请参阅http://en.wikipedia.org/wiki/Confused_deputy_problem

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

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

答案 4 :(得分:0)

wininet dll有一个函数InternetCheckConnection

还要看InternetGetConnectedState

答案 5 :(得分:-1)

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

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

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

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

这只是内部系统的一个问题,因为在第三方数据中心,不应该有任何没有自己保护的私人服务器。换句话说,如果它在您的公司,他们可能希望他们的防火墙保护整个数据中心,这是合理的,如果有点冒险。但是当你从互联网上有数据中心的第三方租用托管时,你必须假设数据中心内的所有内容都与外面的内容一样具有潜在的敌意。