[英]IP Address using PHP not reliable
我使用(http://www.iplocationtools.com)的JavaScript API向我提供来自访问者IP的位置数据。 由于某种原因,他们的API不会给我访客的实际IP,而不能给我其他信息,这就是为什么我必须使用PHP和CodeIgniter来给我IP的原因。
因此,我使用CodeIgniter / PHP来获取访问者的IP,并通过使用PHP的ip2long将其与位置数据一起从上方添加到数据库中([ip ip igniter给我提供])
当我的数据库表看起来像这样时,我感到困惑: http : //pulse.media.mit.edu/images/1.png
哪有错 我很想相信CodeIgniter是错误的,因为它多次给我相同的IP。 年龄和性别是自我报告的,我怀疑有人会构成所有这些信息。
归根结底,我们真正需要的只是用户的IP和位置,最好是来自同一来源,因此我们不会增加错误。
有人对此有更好的主意吗?
编辑:这是我用来从CodeIgniter获取IP地址的代码
$data['ip_address'] = ip2long($this->input->ip_address());
$this->pulse_model->voter_info($data);
然后,表决器信息功能只是将其插入存储为INT(11)的数据库中。
这是功能ip_address:
函数ip_address(){如果($ this-> ip_address!== FALSE){返回$ this-> ip_address; }
if (config_item('proxy_ips') != '' && $this->server('HTTP_X_FORWARDED_FOR') && $this->server('REMOTE_ADDR'))
{
$proxies = preg_split('/[\s,]/', config_item('proxy_ips'), -1, PREG_SPLIT_NO_EMPTY);
$proxies = is_array($proxies) ? $proxies : array($proxies);
$this->ip_address = in_array($_SERVER['REMOTE_ADDR'], $proxies) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
}
elseif ($this->server('REMOTE_ADDR') AND $this->server('HTTP_CLIENT_IP'))
{
$this->ip_address = $_SERVER['HTTP_CLIENT_IP'];
}
elseif ($this->server('REMOTE_ADDR'))
{
$this->ip_address = $_SERVER['REMOTE_ADDR'];
}
elseif ($this->server('HTTP_CLIENT_IP'))
{
$this->ip_address = $_SERVER['HTTP_CLIENT_IP'];
}
elseif ($this->server('HTTP_X_FORWARDED_FOR'))
{
$this->ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
if ($this->ip_address === FALSE)
{
$this->ip_address = '0.0.0.0';
return $this->ip_address;
}
if (strpos($this->ip_address, ',') !== FALSE)
{
$x = explode(',', $this->ip_address);
$this->ip_address = trim(end($x));
}
if ( ! $this->valid_ip($this->ip_address))
{
$this->ip_address = '0.0.0.0';
}
return $this->ip_address;
}
$_SERVER['REMOTE_ADDR']
是用于返回查看页面人员IP地址的PHP代码。
如果IPv4地址无效,则旧版本的ip2long()
将返回-1。 您可能要改用inet_pton
,并将用于保存它的字段扩展为128位。
根据您的代码,如果IP无效或无法确定,看起来$this->input->ip_address()
可能返回“ 0.0.0.0”。 但是,您的评论还指出,即使上述方法返回“ 0.0.0.0”,也需要记录IP地址。
首先,我建议检查一下$this->input->ip_address()
和$this->valid_ip()
是否按预期工作。 $this->valid_ip()
是否$this->valid_ip()
应该被视为有效的IP返回false?
其次,如果$this->input->ip_address()
返回'0.0.0.0',我将更新您的代码,使其始终退回到$_SERVER['REMOTE_ADDR']
。
$ip_address = $this->input->ip_address();
if($ip_address == '0.0.0.0') {
$ip_address = $_SERVER['REMOTE_ADDR'];
}
$data['ip_address'] = ip2long($ip_address);
$this->pulse_model->voter_info($data);
或者,如果您愿意,则不能使用$this->input->ip_address()
并按照@rockerest的建议进行操作,而只需使用$_SERVER['REMOTE_ADDR']
即可。
$data['ip_address'] = ip2long($_SERVER['REMOTE_ADDR']);
$this->pulse_model->voter_info($data);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.