2009-11-04 115 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應用程序跳過外部訪問者必須跳躍的相同環節。讓它無法訪問外部訪問者也無法訪問的資源。提供一個不允許外部訪問者區分「未找到頁面」和「拒絕訪問」的錯誤頁面。