透過分析 HTTP 請求標頭中的 HTTP_VIA、HTTP_X_FORWARDED_FOR、REMOTE_ADDR 三個關鍵變數,可判斷客戶端是否使用代理及其匿名等級。
| 代理類型 | REMOTE_ADDR | HTTP_VIA | HTTP_X_FORWARDED_FOR | 匿名程度 |
|---|---|---|---|---|
| 無代理 | 真實 IP | 無/不顯示 | 無/不顯示 | 完全透明 |
| 透明代理 | 代理 IP | 代理 IP/閘道資訊 | 真實 IP | 無匿名性 |
| 普通匿名 | 代理 IP | 代理 IP/閘道資訊 | 代理 IP | 隱藏真實 IP,但暴露使用代理 |
| 欺騙性代理 | 代理 IP | 代理 IP/閘道資訊 | 隨機 IP | 偽造假 IP 欺騙對方 |
| 高匿名代理 | 代理 IP | 無/不顯示 | 無/不顯示 | 完全替代真實身份 |
<?php
if (!empty($_SERVER['HTTP_VIA'])) {
// 使用了代理
if (!isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
// 普通匿名代理
$proxyIp = $_SERVER['REMOTE_ADDR'];
} else {
// 透明代理
$proxyIp = $_SERVER['REMOTE_ADDR'];
$realIp = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
} else {
// 無代理 或 高匿名代理(無法區分)
$realIp = $_SERVER['REMOTE_ADDR'];
}
?>
可至 https://ip.mixsec.org/ 掛上代理測試,觀察三個變數實際值。
proxy judges 進一步驗證代理存活度與匿名等級。HTTP_X_FORWARDED_FOR 可被偽造,不可作為唯一身分認定依據。