我已经激活
HostnameLookups Double
在我的 Apache2 配置中,这样我就可以存储用户的远程主机并确保他们的 IP 地址是真实的并且没有被欺骗。
但是,我注意到对于我的很多“用户”(输入表单的人)来说,尽管有上述配置,但 $_SERVER['REMOTE_HOST'] 只是空的(而对于大多数其他人来说,它是非空的)。这是否意味着这些用户具有欺骗性 IP 地址,或者这些用户仍然是诚实的普通用户?还有什么可以解释这一点?
我已经激活
HostnameLookups Double
在我的 Apache2 配置中,这样我就可以存储用户的远程主机并确保他们的 IP 地址是真实的并且没有被欺骗。
但是,我注意到对于我的很多“用户”(输入表单的人)来说,尽管有上述配置,但 $_SERVER['REMOTE_HOST'] 只是空的(而对于大多数其他人来说,它是非空的)。这是否意味着这些用户具有欺骗性 IP 地址,或者这些用户仍然是诚实的普通用户?还有什么可以解释这一点?
并非每个主机都有主机名 :)
您可能想使用'REMOTE_ADDR'
引用 Apache 文档:
Double 的值是指进行双反向 DNS 查找。也就是说,在执行反向查找之后,然后对该结果执行正向查找。正向查找中至少有一个 IP 地址必须与原始地址匹配。(在“tcpwrappers”术语中,这称为 PARANOID。)
我怀疑如果正向查找不匹配,则该字段为空。
正如@avnr 所说,IP 地址并不总是有 PTR 记录。
并且在任何情况下都不能确保 IP 没有被欺骗,它只是确保原始 IP 的 DNS 配置具有 PTR 和 A 记录匹配。
只需使用这个:
if(isset($_SERVER['REMOTE_HOST'])){//check
$ip = $_SERVER['REMOTE_HOST'];
}else{
$ip = $_SERVER['REMOTE_ADDR'];//else assign the real IP
}
echo $ip;
试试这个
$ip = getenv('REMOTE_ADDR'); 而不是 $_SERVER['REMOTE_ADDR'];
getenv() is used to get the value of an environment variable in PHP
$_SERVER is an array contains server variables created by the web server.