在PHP中,常見獲取請求IP的方式一般是通過3個超全局變量,不過很顯然三種獲取IP的方式并不完全可靠。
$_SERVER['REMOTE_ADDR']; // 客戶端與服務器握手IP,如果使用代理則會獲取到代理IP $_SERVER['HTTP_CLIENT_IP']; // 代理服務器發(fā)送的HTTP頭(可偽造) $_SERVER['HTTP_X_FORWARDED_FOR']; // 用戶是在哪個IP使用的代理(可偽造)
如果域名沒有經過代理,一般穩(wěn)妥的方式是 REMOTE_ADDR,如果是海外網絡最穩(wěn)妥的方式是云廠商提供可靠的源IP獲取方式,如谷歌云提供的:
當沒有出現(xiàn)偽造IP時,X-forwarded-For 一般是客戶端真實IP,負載均衡 IP
當出現(xiàn)偽造IP時,谷歌云將偽造的內容進行前置,格式是 <偽造內容>,客戶端真實IP,負載均衡 IP
所以無論是否偽造,我們都可以通過逗號切割字符串,找到倒數(shù)第二個X-forwarded-for的值,就可以獲取到真實客戶端IP。
當然,如果域名云廠商沒有提供類似的域名信息,我們就無法簡單通過超全局變量進行獲取了。
當域名云廠商沒有提供相應的請求源IP信息時,這時我們也可以通過服務端交互雙方協(xié)商一種確認機制。
類似:在HTTP請求頭加入源IP信息進行判斷,由于是服務端之間的通信過程,偽造方無法知道偽造的具體信息內容,因此通常情況下這樣的交互是可靠的。
判斷邏輯過程
服務端A: HTTP請求頭加入變量 MY_REALIP_c32fsjk234 => “1.2.3.4”,這時需要注意,變量名稱盡量不要太簡單,并且最好雙方約定一個隨機密鑰作為變量名稱,類似 MY_REALIP_c32fsjk234
接受請求端B: 通過 $_SERVER[‘MY_REALIP_c32fsjk234’] 判斷請求頭是否包含 MY_REALIP_c32fsjk234 變量,如果有,獲取相應的IP作為真實IP。
原文鏈接:https://blog.csdn.net/panguangyuu/article/details/122211682
推薦閱讀:
php教程