【问题标题】:How can I get user's IP and block it?如何获取用户的 IP 并阻止它?
【发布时间】:2016-11-03 06:17:42
【问题描述】:

我正在尝试阻止我网站的一些用户。好吧,我需要两件事:

  • 获取用户IP
  • 阻止它

我已经搜索过它们。我知道我必须得到用户的 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?

【问题讨论】:

  • 您可以编写自己的 php 代码来阻止 ips。在您的数据库中,有一个像 ipBan 之类的表,然后每当用户访问您的网站时,在 ipBan 表中搜索他们的 ip。如果找到,只需将它们重定向到空白.php 之类的页面。容易。
  • 我不知道网络/掩码是什么东西,ip2long 完全没有必要。 if($_SERVER['REMOTE_ADDR'] == 'ip you want to block') { die('Unauthorized.'); }
  • @stack 是的,非常错误。
  • 正确。请注意,除非您的 Apache 服务器打开了 HostnameLookups On,否则根据 PHP 文档,REMOTE_HOST 不存在(不确定 nginx 是否有类似的东西)。由于这对服务器来说有点重,它很可能是关闭的并且是空的。
  • 你似乎让这件事变得比它需要的复杂得多。

标签: php ip


【解决方案1】:

REMOTE_HOST 通常包含反向dns lookup 的结果,也可以在PHP 中使用gethostbyaddr 在您的服务器未填充此环境变量的情况下完成。它派生自 $_SERVER['REMOTE_ADDR'] 值,顾名思义,它代表 (IP) 地址。

在共享主机上禁止 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 地址到您的服务器的任何连接尝试。听起来很酷?如果您想尝试的话,根服务器现在并不昂贵。

【讨论】:

  • 啊,我明白了,点赞。当用户使用代理时会发生什么?我想我也需要检查$_SERVER['HTTP_X_FORWARDED_FOR']。我说的对吗?
  • 是的,但无论如何 IP 地址都不是那么可靠。我假设你家里也有一个路由器,但是如果这个路由器被一所大学的所有人使用并且你禁止 IP 地址,你最终会阻止整个大学访问你的站点,因为一个人做了某事'。 IP 地址背后的真人很难识别,例如也可能使用 tor。
  • 好的,我只是想知道,当用户使用代理时会发生什么?一个真实的 IP 还在REMOTE_ADDR?或者它会进入HTTP_X_FORWARDED_FOR?还是它们都包含两个不同的 IP?
  • 我会使用 HTTP_X_FORWARD_FOR 取代 REMOTE_ADDR,因为它 - 更有可能 - 包含原始 IP。但我会考虑使用您掌握的有关访问者的其他信息,例如他/她通常何时访问、浏览器版本等,我认为谷歌也会进行此类检查以识别用户。我读过谷歌可以通过他们的打字速度和他们通常拼错的单词等来部分识别用户;)
  • :-) 我将您的答案标记为已接受答案。再次感谢。只是我的最后一个问题:您在解释中说哪个更好?通过 PHP 或使用 fail2ban 之类的方法来做到这一点?
猜你喜欢
  • 1970-01-01
  • 2016-11-11
  • 2020-02-21
  • 2023-03-18
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
相关资源
最近更新 更多