服務端如何安全獲取客戶端請求IP地址


  服務端如何獲取客戶端請求IP地址,網上代碼一搜一大把。其中比較常見有x-forwarded-for、client-ip等請求頭,及remote_addr參數,那么為什么會存在這么多獲取方式,以及到底怎樣獲取才是安全的呢?

一、remote_addr、x-forwarded-for、client-ip是神馬?

  remote_addr指的是當前直接請求的客戶端IP地址,它存在於tcp請求體中,是http協議傳輸時自動添加的,不受請求頭header所控制。所以,當客戶端與服務器間不存在任何代理時,通過remote_addr獲取客戶端IP地址是最准確的,也是最安全的。

  x-forwarded-for簡稱XFF,它其實和http協議本身並沒什么關系,是很多代理服務器在請求轉發時添加上去的。如果客戶端和服務器之間存在代理服務器,那么直接通過remote_addr獲取的IP就是代理服務器的地址,並不是客戶端真實的IP地址。因此,需要代理服務器(通常是反向代理服務器)將真實客戶端的IP地址轉發給服務器,轉發時客戶端的真實IP地址通常就存在於x-forwarded-for請求頭中。

  client-ip同x-forwarded-for,也是代理服務器添加的用於轉發客戶端請求的真實IP地址,同樣保存於請求頭中。

二、總結

  通過什么參數來獲取客戶端請求地址是由實際的應用場景決定的:

  當客戶端與服務器之間不存在代理服務器(尤其指服務端反向代理服務器)時,直接通過remote_addr獲取客戶端請求IP地址。

  當服務器間存在反向代理服務器時,需要在反向代理服務器中轉發客戶端真實請求IP地址,可以設置x-forwarded-for、client-ip,也可以自定義請求頭名稱,然后在服務端代碼中獲取請求頭中的該值。需要注意的是,此時必須保證服務器不會繞過代理服務器直接對外提供服務,否則存在IP偽造的風險(客戶端偽造設置請求頭)。

  nginx設置方式:

proxy_set_header x-rewarded-for $remote_addr;
三、參考資料

  《構造HTTP請求Header實現“偽造來源IP”》 

  《怎樣正確設置remote_addr和x_forwarded_for

  《多重代理時如何防止偽造X-Forwarded-For且獲取真實IP


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM