在PHP中,常見取得請求IP的方式一般是透過3個超全域變量,不過很明顯三種取得IP的方式並不完全可靠。
$_SERVER['REMOTE_ADDR']; // 客户端与服务器握手IP,如果使用代理则会获取到代理IP $_SERVER['HTTP_CLIENT_IP']; // 代理服务器发送的HTTP头(可伪造) $_SERVER['HTTP_X_FORWARDED_FOR']; // 用户是在哪个IP使用的代理(可伪造)
如果網域沒有經過代理,一般穩健的方式是REMOTE_ADDR,如果是海外網路最穩健的方式是雲端廠商提供可靠的來源IP取得方式,如Google雲端提供的:
當沒有出現偽造IP時,X-forwarded-For 一般是客戶端真實IP,負載平衡IP
#當出現偽造IP時,Google雲端將偽造的內容進行前置,格式是,客戶端真實IP,負載平衡IP
所以無論是否偽造,我們都可以透過逗號切割字串,找到倒數第二個X-forwarded- for的值,就可以取得到真實客戶端IP。
當然,如果域名雲廠商沒有提供類似的域名信息,我們就無法簡單透過超全局變數進行獲取了。
當網域雲端廠商沒有提供對應的請求來源IP資訊時,這時我們也可以透過服務端互動雙方協商確認機制。
類似:在HTTP請求頭加入來源IP資訊進行判斷,由於是服務端之間的通訊過程,偽造方無法知道偽造的特定資訊內容,因此通常情況下這樣的互動是可靠的。
判斷邏輯流程
服務端A: HTTP請求頭加入變數MY_REALIP_c32fsjk234 => “1.2.3.4”,這時要注意,變數名稱盡量不要太簡單,並且最好雙方約定一個隨機密鑰作為變量名稱,類似MY_REALIP_c32fsjk234
接受請求端B: 透過$_SERVER['MY_REALIP_c32fsjk234'] 判斷請求頭是否包含MY_REALIP_c32jfsk234 變量IP作為真實IP。
原文連結:https://blog.csdn.net/panguangyuu/article/details/122211682
推薦閱讀:
以上是PHP如何才能取得真實IP的詳細內容。更多資訊請關注PHP中文網其他相關文章!