2009-11-04 143 views
2

我有一个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; 
    } 

我的,它并不能满足的唯一要求是,我们产品的一些设施将存在彼此旁边,你将无法在他们之间导入信息 - 我怀疑这需要使用代理服务器来获取事物的最终视图,但由于这不是我的项目的要求,所以我会将其留给别人。

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

+0

从自己的网站外键入URL到Web浏览器... – 2009-11-04 11:20:10

+0

一个基于Web的代理就派上用场了点。甚至是一个普通的HTTP代理。 – 2009-11-04 11:21:48

+0

我的意思是以编程方式 - 用户提交的网址,并在我得到它之前,我需要知道它不是一个私人网站托管在防火墙后的某处。 – 2009-11-04 11:23:21

回答

1

运行跟踪路由(一系列短TTL的ping命令的地址的,如果防火墙(s)为(是)啤酒花之一,那么它是来自组织外部可见,所以应该可以接受。

系统.Net.NetworkInformation有一个ping类,它可以为tracert类似例程提供足够的信息。

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

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

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

应该是足够好了可靠的本地网络。

+0

我想你可能已经用traceroute在那里钉了它。内部防火墙会有问题,因为服务器必须访问各种其他机器的数据库,防病毒,lucene索引等。 – 2009-11-04 12:10:04

0

检查URL地址,看它是否与你的服务器地址相符?

编辑:或核对地址范围......

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

也许某些脚本在浏览器中检查URL是否可访问,并通知服务器结果。 但用户可以编辑页面或模拟结果...

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

+0

主要问题是它可能试图访问防火墙后面的不同站点,这些站点可能会或可能不会坐在相同的IP上。 – 2009-11-04 11:40:25

1

只有两件事情值得思考。

  1. 有一个值得信赖的外部服务器验证地址的可见性(如HTTP代理)
  2. 检查DNS记录在网站上 - 如果它解析为内部的东西(127.0.0.110.*192.168.*等)拒绝它 - 当然,这可能行不通取决于你的内部网络是如何建立

不知道这是否是对托管解决方案第三方或你/你的公司的内部网络品牌内很难说哪个解决方案会最好;祝你好运。

编辑:第二个想法,我已经取消了第二个建议,因为它仍然会让你打开DNS重新绑定。为了这个目的,我会在这里留下,但我不认为这是个好主意。这就是说,如果你有一定的能力来控制这个服务器的网络化妆,那么它应该可能生活在它自己的世界里,专用的,在它的专用网络上没有其他东西。

+0

我担心你的第一个选择是唯一发生在我或我问过这个问题的其他人,因为这需要我依赖额外的基础设施。 选项2并不理想,因为我们可能在可路由的IP上有一个站点,在防火墙上应用了其他安全限制,因此应该无法访问。 尽管感谢您的回答。 – 2009-11-04 11:50:13

+0

总的来说,我仍然会说它坐在自己的宇宙的私人角落,以防止这种问题甚至有可能发生。除此之外,您所做的任何解决方法都会有一些失败点,所以如果您能够解决这个问题,它似乎是最安全的。 – Dereleased 2009-11-04 11:59:00

-1

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

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

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

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

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

+0

不,问题是,我的web服务器正在执行http get的事实在防火墙上打开了一个漏洞,因为它可以获取任何可以访问它并将其返回给用户的东西。防火墙配置是健全的。 – 2009-11-04 12:06:14

0

不要担心任何人的网络资产的公众可访问性,这个问题在所有情况下都没有明确的答案。只是尽量不要让访问策略损害您自己的(或您的客户等)网络资产。

使用现有的访问控制机制来控制Web应用程序的访问。不要仅仅访问访问控制机制,以便在Web应用程序中复制它们。这将依赖于Web应用程序来避免使用它的完全访问权限 - 如果Web应用程序遭到入侵或者访问控制复制功能中存在一个错误,那么这是一种虚假的依赖。见http://en.wikipedia.org/wiki/Confused_deputy_problem

由于Web应用程序充当外部访问者的代理,因此如果可以,就好像它驻留在内部网络之外一样。也许把它放在DMZ中。请注意,我并没有声称解决方案是网络配置之一,我只是说,如果访问者试图直接访问该页面,解决方案应该处于与解决方案相同的级别。

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

相关问题