我试图阻止我网站的某些用户。我需要两件事:
我搜索过他们。我知道我必须获得用户的IP like this:
$ip = $_SERVER['REMOTE_ADDR'];
// or sometimes $_SERVER['HTTP_X_FORWARDED_FOR']
我必须阻止它like this:
$network = ip2long("10.12.0.0");
$mask = ip2long("255.255.0.0");
$ip = ip2long($_SERVER{'REMOTE_HOST'});
if (($network & $mask) == ($ip & $mask)) {
die("Unauthorized");
}
如您所见,要阻止IP,它会使用$_SERVER{'REMOTE_HOST'}
。那么$_SERVER{'REMOTE_HOST'}
和$_SERVER['REMOTE_ADDR']
之间有什么不同?哪一个包含IP?
答案 0 :(得分:2)
REMOTE_HOST通常包含反向dns lookup的结果,并且在使用gethostbyaddr的情况下也可以在PHP中完成,您的服务器不会填充此环境变量。它来自$_SERVER['REMOTE_ADDR']
值,它代表(IP)-address,顾名思义。
在共享主机上禁止IP地址不是最佳选择,我稍后会介绍。假设您使用的是共享主机,我不会让脚本像您一样死掉。相反,我只会返回一个HTTP标头,以便(至少)在该IP上节省一些带宽,如:
if($_SERVER['REMOTE_ADDR'] == "127.0.0.1")
{ header("HTTP/1.1 403 Forbidden" ); exit; }
并将这样的内容返回给访问者(使用铬):
在许多共享主机上无法使用更干净,更专业的方法阻止IP地址,但无论如何都应该在这里提及,因为它可以节省带宽,内存和cpu周期,可以说是动态创建防火墙规则。有一些工具,如fail2ban,有助于克服不同防火墙之间的兼容性问题,使您的PHP应用程序可以在根服务器之间移植。 Fail2ban可以扫描各种日志文件,甚至是自定义日志文件。您的PHP应用程序只能写入日志文件,fail2ban将禁止从该IP地址到您的服务器的任何连接尝试。听起来很酷?如果你想尝试它,root服务器现在很昂贵。