2009-04-15 147 views
27

如果Request.ServerVariables [「HTTP_X_FORWARDED_FOR」]返回多個IP,我該採取哪一種方式,以及如何在c#中執行此操作?這是我的理解,如果它是空白或空的,那麼客戶端計算機不會通過代理,我可以從Request.ServerVariables [「REMOTE_ADDR」]。這是一個正確的說法嗎?如果HTTP_X_FORWARDED_FOR包含多個IP地址,我該如何獲得正確的IP?

通過「我該選哪一個」,我的意思是我要在列表中選擇第一個IP還是最後一個IP,並且我所要做的就是將其分成一個數組並採取我想要的。我不太確定HTTP_X_FORWARDED_FOR是如何工作的。

回答

35

根據this,格式X - 轉發,對於HTTP標頭是:

X-Forwarded-For: client1, proxy1, proxy2, ... 

所以要在客戶端的IP地址在列表中

2

在可靠性被攝體A進一步注意:

任何人都可以通過使用工具僞造HTTP_X_FORWARDED_FOR如Firefox插件「篡改數據」或它們自己的本地代理(例如Privoxy的)。這意味着整個字符串可能是假的,並且REMOTE_ADDR是實際的原始主機。這也可能意味着第一個「client1」地址被僞造,然後客戶端通過代理連接,導致proxy1成爲客戶端的IP地址,REMOTE_ADDR成爲使用的單個代理。

如果你想拒絕基於IP的訪問,我會建議檢查XFF頭中的每個IP地址以及REMOTE_ADDR。

如果您希望根據IP地區授予訪問權限,我建議只有在XFF爲空白且IP來自適當區域時才允許訪問。

但是,正如Mastermind已經指出的那樣,有代理會隱藏代理鏈。例如,Tor網絡將使請求看起來好像來自最終代理機器,而不是原始IP。匿名代理通常會聲稱他們正在轉發與REMOTE_ADDR中報告的IP相同的IP。

基於IP的過濾通常是訪問控制的非常原始的最後手段機制。

+0

那麼爲什麼AWS和Azure等公司依靠IP地址來配置安全組規則? – 2016-09-28 11:19:04

0

實際的客戶端IP應該是標頭值中最左邊的IP地址。您可以使用正則表達式提取成一個環境變量:

SetEnvIf X-Forwarded-For "^(\d{1,3}+\.\d{1,3}+\.\d{1,3}+\.\d{1,3}+).*" XFFCLIENTIP=$1 

的使用注意事項1$來設置XFFCLIENTIP環境變量保持第一組的內容的正則表達式(括號)。

作爲使用它的一個例子,您可以定義一個使用變量的日誌格式:這個例子是我們在nearmap內部使用的一個例子。因此它會記錄額外的信息,但是您想要的位數是開頭的。請注意行尾的env = XFFCLIENTIP,這意味着只有在設置了環境變量時才使用此格式。

CustomLog /var/log/apache2/access.log "%{XFFCLIENTIP}e \"%{session}C\" \"%{nearmapuid}C\" %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" env=XFFCLIENTIP