问题:
使用帝国 cms 的反馈信息模块时,发现在用户提交过来的表单中,一部分 IP 获取的不完整。比如:
查看代码:
发现在 /e/class/connect.php 中,获取 IP 的代码是这样的:
//取得IP
function egetip(){
global $ecms_config;
if(getenv('HTTP_CLIENT_IP')&&strcasecmp(getenv('HTTP_CLIENT_IP'),'unknown'))
{
$ip=getenv('HTTP_CLIENT_IP');
}
elseif(getenv('HTTP_X_FORWARDED_FOR')&&strcasecmp(getenv('HTTP_X_FORWARDED_FOR'),'unknown'))
{
$ip=getenv('HTTP_X_FORWARDED_FOR');
}
elseif(getenv('REMOTE_ADDR')&&strcasecmp(getenv('REMOTE_ADDR'),'unknown'))
{
$ip=getenv('REMOTE_ADDR');
}
elseif(isset($_SERVER['REMOTE_ADDR'])&&$_SERVER['REMOTE_ADDR']&&strcasecmp($_SERVER['REMOTE_ADDR'],'unknown'))
{
$ip=$_SERVER['REMOTE_ADDR'];
}
if($ecms_config['sets']['getiptype']>0)
{
$ip=egetipadd();
}
$ip=RepPostVar(preg_replace("/^([\d\.]+).*/","\\1",$ip));
return $ip;
}
代码中发现了有正则表达式,所以怀疑可能是 IPV6 被截取导致的 IP 显示不全。因此可注释掉。
分析
- 正则表达式截断了用户的 IPV6 地址,导致显示不完整;
- 用户采取措施阻止获取 IP 地址,导致获得的值可能是部分或截断的 IP 地址,例如:“2”或“10.0”。可能是由于用户网络或软件的配置方式所致,或者由于 IP 地址被代理或负载平衡器等中介机构转发或屏蔽的方式所致。