繁体   English   中英

PHP中的客户端IP不正确

[英]Incorrect Client IP in PHP

在某些情况下,对于PHP中的客户端IP,我得到了一个奇怪的结果。

大多数情况下的结果(预期结果):

192.123.132.123

错误结果类型1:

for="192.123.132.123"

错误结果类型2:

for="192.123.132.123:1232"

获取IP的代码:

<?php

function getIP(){
$ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '-';
$proxy = false;
if (!empty($_SERVER['HTTP_VIA']) || !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $proxy = true;
} elseif (!empty($_SERVER['REMOTE_HOST'])) {
    $aProxyHosts = array('proxy','cache','inktomi');
    foreach ($aProxyHosts as $proxyName) {
    if (strpos($_SERVER['REMOTE_HOST'], $proxyName) !== false) {
        $proxy = true;
        break;
    }
    }
}
// Has the viewer come via an HTTP proxy?
if ($proxy) {
// Try to find the "real" IP address the viewer has come from
$aHeaders = array('HTTP_FORWARDED','HTTP_FORWARDED_FOR','HTTP_X_FORWARDED','HTTP_X_FORWARDED_FOR','HTTP_CLIENT_IP');
foreach ($aHeaders as $header) {
    if (!empty($_SERVER[$header])) {
        $ip = $_SERVER[$header];
        break;
    }
}
}
if (!empty($ip)) {
// The "remote IP" may be a list, ensure that
// only the last item is used in that case
$ip = explode(',', $ip);
$ip = trim($ip[count($ip) - 1]);
}
return $ip;
}

?>

我知道我可以清除结果以获得正确的值(IP),但是我很困惑为什么会首先发生这种情况。

PS:192.123.132.123是用于解释此问题的任意IP。

您正在读取任意的HTTP标头...并非所有标头都纯粹包含IP,有些以for=...的形式存在,有些还包含端口。

  1. 使用任何HTTP标头代替$_SERVER['REMOTE_ADDR']意味着您允许任何人通过简单地发送HTTP标头来屏蔽/伪造其IP地址。 您应该完全知道可以在何处设置此类标头,这通常意味着您知道它们是由您控制的代理设置的。 在这种情况下,您显然不知道这些标头来自何处,因此您不应使用它们。
  2. 如果决定使用HTTP标头,则应该知道要确切地读取哪个标头以及它采用的格式。如果其格式为for=... ,则可以正确解析该格式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM