簡體   English   中英

使用PHP獲取用戶真實的IP地址

[英]Getting Users Real IP address using PHP

即使他們使用像hidemyass.com這樣的代理網站,我也想從我網站上的用戶那里獲得真實的IP地址

這是我的代碼並認為它​​有效,但我測試了它,但它沒有

<?php
function getRealIpAddr()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}
?>

我認為這段代碼可行,但代理仍然繞過它。

提前致謝。

如果代理不想告訴你它(並且任何真正的匿名代理都不會 ),則無法保證獲得“真實”IP地址。

你不能。 您擁有的信息來自apache / iis / whatever,它只知道誰與您的服務器通信,在這種情況下,它是代理服務器。 除非代理想要在標題中發送該信息,否則您將無法獲得它。

X-Forwarded-For是您可以做的最好的,但它不太可能是匿名代理發送的。

除非您在編碼IP地址的應用程序層實現某種身份驗證協議(這受到欺騙行為的影響),否則您無法確定獲得“真實”的IP地址。

為什么是這樣?

因為IP數據包可以被訪問它的“中間”的人任意重寫。 例如,代理,路由器,網關等。

IP數據包具有這種結構

| stuff | src ip | dst ip  | stuff |
| ....  | 32-bits| 32 bits | stuff |

所以src ip - 那些只是位,記住 - 可以被任意覆蓋。

http://www.faqs.org/rfcs/rfc791.html將提供更多信息。

除非代理將真正的IP地址放在標題中(常見 - 取決於代理使用的原因)(通常以某種形式的“X-something”),否則您只能看到代理的IP地址。

請試試這個

function get_IP_address()
{
  foreach (array('HTTP_CLIENT_IP',
               'HTTP_X_FORWARDED_FOR',
               'HTTP_X_FORWARDED',
               'HTTP_X_CLUSTER_CLIENT_IP',
               'HTTP_FORWARDED_FOR',
               'HTTP_FORWARDED',
               'REMOTE_ADDR') as $key){
    if (array_key_exists($key, $_SERVER) === true){
        foreach (explode(',', $_SERVER[$key]) as $IPaddress){
            $IPaddress = trim($IPaddress); // Just to be safe

            if (filter_var($IPaddress,
                           FILTER_VALIDATE_IP,
                           FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)
                !== false) {

                return $IPaddress;
            }
        }
    }
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM