在ASP.NET中如何正確的獲取IP資訊

在ASP.NET的環境中,當你的客戶端是來自網路的彼端,IP資訊自然是重要的了,無論是在LOG亦或是權限的判別,都會有其需要採用識別之處,因此這篇文章就是在講要如何正確地獲取IP資料。

不要再用錯誤的方式來取用IP了

所有的WEB開發者都必須透過網站伺服器取得的HTTP Header來取得IP,但是這可是有前提的,要知道很多的HTTP Header都是可以在Client端的Browser中變造,也就是說,你可能會取得到一個經過變造過的字串。

而取得變造過的字串的風險,就是當你需要面對網站安全或訴訟時,都會觸發一連串的災難,這個災難有時會變成不可承受之重啊。

請唯一認明HTTP Header "REMOTE_ADDR"

一般要獲取用戶端IP時,常會以下列HTTP標頭來取得這些值,但請你要特別知道,這些東西都是可以變造的,請「千萬不要使用」。你唯一可以信任的,就只有「REMOTE_ADDR」這個好朋友,這篇文章沒有打算進行任何實驗舉證,總之我只能說不信的話你就等著中獎吧!

V ["REMOTE_ADDR"]
X ["HTTP_CLIENT_IP"]
X ["HTTP_X_FORWARDED_FOR"] 通常用於Proxy IP,但極容易被偽造
X ["HTTP_X_FORWARDED"]
X ["HTTP_X_CLUSTER_CLIENT_IP"]
X ["HTTP_FORWARDED_FOR"]
X ["HTTP_FORWARDED"]
X ["HTTP_VIA"]
X ["X-CLIENT-IP"]

再論ASP.NET中的Request.UserHostAddress

在ASP.NET中,我們可以輕易地使用System.Web.HttpContext.Current.Request.UserHostAddress或者是Request.UserHostAddress,來取得Client端得IP,但是,透過上面文章的描述,不經讓我們懷疑透過這個方法來取得的IP來源是否為正確(安全)的?

透過.NET的原始碼反查到 HttpRequest.cs 類別,我們可以得知UserHostAddress成員,與Request.ServerVariables["REMOTE_ADDR"];是等效的運算式。

AddServerVariableToCollection("REMOTE_ADDR",        this.UserHostAddress);

所以以後就不要再寫出下面這種重複的程式碼了。(雖然說也無妨啦!)

string cIP = System.Web.HttpContext.Current.Request.UserHostAddress;
if (System.String.IsNullOrEmpty(cIP)) { cIP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; }
ASP.NET ClientIP Danger Fake UserHostAddress REMOTE_ADDR