2016-09-27 32 views
0

我有作爲其假設可以在example1.com,example2.com達到一個HTTP服務器C#應用程序等什麼是檢查的一種有效方式,如果一個URL對應於當前機器

服務器在啓動時沒有這些信息。相反,它會查看每個HTTP請求中的「主機」字段以瞭解其「已知名稱」並填充列表,即('example1.com','example2.com','localhost')

如果服務器收到一個錯誤或惡意的HTTP請求,並且有一個無效的主機字段,它仍會添加錯誤的主機名。

我想檢查進入我的服務器的HTTP請求的主機字段,以查看它們是否與當前機器相對應。是否可以做到這一點,沒有任何額外的網絡請求?

+0

你爲什麼不告訴我們你目前如何檢查URL是否包含特定的網址或按名稱的URL ... – MethodMan

+0

首先你需要定義你的意思是「對應」?您是否想知道哪些主機名具有指向您機器的DNS條目?代理服務器(DNS)可能指向負載均衡器,但內容始終來自服務器(羣集)?只有在你定義你想要達到的目標之後,你才能問一下沒有網絡請求是否可以完成。 –

回答

1

該應用程序需要測試它是否實際上是example.com。我沒有看到任何其他(可靠的)解決方案。由於webapp可以擁有私人地址,因此您不一定需要依靠DNS查找。

您可以爲這些測試設置一個特殊的端點。我想象中的流程是這樣的:

  1. 服務器收到www.example.com/blah.html
  2. 這是第一次應用程序被問及www.example.com所以,以確保它確實是www.example.com請求時,它生成並存儲一個大的隨機數,說123456和一個索引,說5
  3. 然後,應用程序向www.example.com/verify_hostname發送挑戰,傳遞索引作爲參數(即www.example.com/verify_hostname?index=5)。
  4. 處理驗證請求的線程按索引查找存儲的隨機數,並以123456作出響應。
  5. 在收到123456的響應後,服務器現在知道它確實可以通過www.example.com進行訪問,至少現在是這樣。

當然這種解決方案的其他變化是可能的。

請注意,此方法利用了應用程序線程共享內存來存儲隨機數和索引的事實。如果Web應用程序部署在羣集中,則需要替換此簡單認證方案。一種方法是使用shared secretchallenge-response或其他一些加密解決方案。

另一件事 - 在解決方案中,我建議在存儲隨機數和索引的線程和驗證它們的線程之間存在固有的競爭條件。在驗證線程嘗試讀取它們之前,您需要確保所選的隨機數和索引已存儲。各種eventual consistency集合將不足以保證它,所以他們可能會不時失敗。

相關問題