【问题标题】:How can I check a url is publicly accessible?如何检查网址是否可公开访问?
【发布时间】:2010-12-12 23:44:48
【问题描述】:

我有一个 Web 应用程序,您可以通过给它一个 url 来从另一个站点导入信息。有人指出,您可以使用此功能访问托管在同一网络服务器上的私人网站。
所以...
如何检查给定的 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,这意味着它们会跳跃。

【问题讨论】:

  • 通过从您的网站外部将 URL 输入网络浏览器...
  • 一个基于网络的代理就派上用场了。甚至是普通的 HTTP 代理。
  • 我的意思是以编程方式 - 用户提交 url,在我得到它之前,我需要知道它不是托管在防火墙后面某处的私人站点。
  • 哦...所以这是安全问题...让我重新标记...
  • 您可能还对string data = new string('a', length);感兴趣

标签: c# .net security url dns


【解决方案1】:

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

编辑:或检查一系列地址...

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

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

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

【讨论】:

  • 主要问题是它可能试图访问防火墙后面的不同站点,该站点可能位于或可能不在同一 IP 上。
【解决方案2】:

脑子里只有两件事。

  1. 让受信任的外部服务器验证地址的可见性(如 HTTP 代理)
  2. 检查站点上的 DNS 记录——如果它解析为内部的东西(127.0.0.110.*192.168.* 等),则拒绝它——当然,这可能不起作用,具体取决于您的内部网络是如何设置的

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

编辑:再三考虑,我取消了第二个建议,因为它仍然会让您对 DNS 重新绑定持开放态度。为此,我将把它留在这里,但我认为这不是一个好主意。

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

【讨论】:

  • 我担心您的第一个选择是我或我问过这个问题的任何其他人唯一想到的选择,因为它需要我依赖额外的基础设施。选项 2 并不理想,因为我们可以在可路由 ip 上拥有一个站点,该站点在防火墙上应用了其他安全限制,因此不应访问。不过感谢您的好回答。
  • 总的来说,我还是会说让它坐在宇宙中自己的私人角落,以防止这种问题甚至有可能发生。除此以外的任何解决方法都会有一些故障点,所以如果你能解决这个问题,它似乎是最安全的。
【解决方案3】:

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

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

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

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

这只是对内部系统的真正关注,因为在第 3 方数据中心不应该有任何没有自己保护的私有服务器。换句话说,如果是在您的公司,他们可能希望他们的防火墙保护整个数据中心,这是合理的,虽然有点冒险。但是,当您从 Internet 上拥有数据中心的第三方租用托管服务时,您必须假设该数据中心内的所有东西都与外部的东西一样具有潜在的敌意。

【讨论】:

  • 不,问题是我的 Web 服务器正在执行 http 获取这一事实在防火墙中打开了一个漏洞,因为它可以获取它可以访问的任何东西并将其返回给用户.防火墙配置良好。
【解决方案4】:

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

System.Net.NetworkInformation 有一个 ping 类,它应该为您提供足够的信息,以便像例程一样进行跟踪。

虽然这听起来确实是个大漏洞,但可能应该考虑另一种方法。防止运行此编的机器。访问内部网络上的任何其他机器可能会更好 - 一种内部防火墙。

我添加了一个简单的跟踪路由,因为你喜欢这个概念:-

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

对于可靠的本地网络应该足够了。

【讨论】:

  • 我想你可能已经用 traceroute 搞定了。内部防火墙会出现问题,因为服务器必须访问各种其他机器以获取数据库、防病毒、lucene 索引等。
【解决方案5】:

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

使用现有的访问控制机制来控制 Web 应用程序的访问。不要仅仅参考访问控制机制以便在 Web 应用程序中复制它们。这将依赖于 Web 应用程序来避免使用其完全访问权限 - 如果 Web 应用程序曾经受到损害或者它只是在访问控制复制功能中存在错误,则这是一种错误的依赖。见http://en.wikipedia.org/wiki/Confused_deputy_problem

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

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

【讨论】:

    【解决方案6】:

    wininet dll有一个函数InternetCheckConnection

    大家也看看InternetGetConnectedState

    【讨论】:

    • 此 URL 回答,即使在 SO 中不推荐,也不回答 OP 问题。
    猜你喜欢
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 2021-06-10
    • 2022-11-07
    • 1970-01-01
    相关资源
    最近更新 更多