1.』remote_addr』 是遠端ip,預設來自tcp 連線是,客戶端的ip。可以說,它最準確,確定是,只會得到直接連伺服器客戶端ip。如果對方通過**伺服器上網,就發現。獲取到的是**伺服器ip了。
如:a->b(proxy)->c ,如果c 通過』remote_addr』 ,只能獲取到b的ip,獲取不到a的ip了。
另外:該ip想篡改將很難實現,在傳遞知道生成php server值,都是直接生成的。
2.』http_x_forwarded_for』,』http_client_ip』 為了能在大型網路中,獲取到最原始使用者ip,或者**ip位址。對http協議進行擴充套件。定義了實體頭。
http_x_forwarded_for = clientip,proxy1,proxy2 所有ip用」,」分割。 http_client_ip 在高階匿名**中,這個代表了**伺服器ip。既然是http協議擴充套件乙個實體頭,並且這個值對於傳入端是信任的,信任傳入方按照規則格式輸入的。以下以x_forword_for例子加以說明,正常情況下,這個值變化過程。
通過剛剛分析我們發現,其實這些變數,來自http請求的:x-forword-for欄位,以及client-ip欄位。 正常**伺服器,當然會按rfc規範來傳入這些值。但是,這些值使用者是可以直接偽造的。
x-forwarded-for不光可以自己設定值,而且可以設定任意格式值。 這樣一來,好比就直接有乙個可以寫入任意值的字段。並且伺服器直接讀取,或者寫入資料庫,或者做顯示。它將帶來危險性,跟一般對入輸入沒有做任何過濾檢測,之間運算元據源結果一樣。 並且容易帶來隱蔽性。
結論:
所以有些getip函式,除了客戶端可以任意偽造ip,並且可以傳入任意格式ip。 這樣結果會帶來2大問題,其一,如果你設定某個頁面,做ip限制。 對方可以容易修改ip不斷請求該頁面。 其二,這類資料你如果直接使用,將帶來sql注入,跨站攻擊等漏洞。至於其一,可以在業務上面做限制,最好不採用ip限制。 對於其二,這類可以帶來巨大網路風險。我們必須加以糾正。
比如你用類似上面的**中獲取ip位址就直接有這樣的sql語句:
string sql = "insert
into (ip) value ('" + ip + "')";
那麼也許破壞者還可以進行sql注入進行資料破壞!!
需要對getip 進行修改,得到安全的getip函式。
在使用netscale等負載均衡裝置或者服務的時候,可以通過負載均衡伺服器對客戶端的remote_addr位址進行編輯,比如擴充套件實體頭(比如:http_***x_clientip),增加對於remote_addr的記錄。就可以保證web伺服器在讀取http_***x_clientip時,就可以讀取到相對於安全ip.
獲取客戶端ip
1.統計訪問者ip位址 2.設定黑名單,黑名單的使用者不可以訪問聊天室。內容提要 這種情況下同樣透露了客戶端是使用了 伺服器 但編造了乙個虛假的隨機ip 220.4.251.159 代替客戶端的真實 ip來欺騙它 獲取客戶端 ip其實不是個簡單的活兒 因為存在 ip欺騙 和 問題 所以獲取客戶端的 ...
獲取客戶端真實IP方法
我們經常會記錄審計日誌,那麼如何獲取客戶端真實ip呢?讓我們了解一下http協議頭吧。remote addr 是你的客戶端跟你的伺服器 握手 時候的ip。如果使用了 匿名 remote addr將顯示 伺服器的ip。http client ip 是 伺服器傳送的http頭。如果是 超級匿名 則返回n...
獲取客戶端的IP
在開發工作中,我們常常需要獲取客戶端的ip。一般獲取客戶端的ip位址的方法是 request.getremoteaddr 但是在通過了apache,squid等反向 軟體就不能獲取到客戶端的真實ip位址了。原因 由於在客戶端和服務之間增加了中間 因此伺服器無法直接拿到客戶端的ip,伺服器端應用也無法...