如何使用基于PHP / MySQL的脚本禁止网站上的IP块?

时间:2012-06-07 19:50:59

标签: php mysql

我有一个相当大的IP和IP块列表,我想禁止它。我所拥有的列表是以块的形式完成的,目前采用这种格式:

1.2.3.4-1.2.3.54
5.6.7.8-5.6.7.8
2.3.4.5-2.3.4.116

我正在尝试通过某种方式将它们放入MySQL数据库中来找到阻止这些IP的最有效方法。当然,我可以将所有块分成单独的IP并将它们放在自己的MySQL记录中,但是对于大量的IP来说这将是非常低效的。阻止整个范围,例如“1.2.3。*”也会导致不必要地禁止大量用户。

有没有办法有效地做到这一点?

3 个答案:

答案 0 :(得分:5)

为什么不使用netmasks

  • 192.168.1.0/24 blocks 192.168.1.0 - 182.168.1.255
  • 1.0.0.0/8 blocks 1.0.0.0 - 1.255.255.255

这种方式只需要5个字节的IPv4地址。如果你想要掩盖你的狡猾,那就做8个字节。

通过简单地将掩码与IP进行对比,可以非常快速地进行比较。这就是IP路由的工作原理。

此外,您可以使用MySQL函数INET_NTOAINET_ATON将点格式的IP地址转换为数字格式,然后再返回,从而使存储高效且易于使用。 / p>

答案 1 :(得分:1)

我会有一个这样的表:

range | start_number | end_number
------+--------------+-----------

其中包含(例如):1.2.3454

然后,您可以轻松检查连接的IP地址是否在该范围内,以及最后一部分是否在start_numberend_number之间。

答案 2 :(得分:1)

您可以使用MySQL INET_ATON()和INET_NTOA()函数。请记住这些是特定于MySQL的,但您也可以使用php实现它们。

这些函数将点地址表示法中的IP地址转换为整数。然后,您可以使用" start_ip"将它们存储在一个表中。和" end_ip"列。当您查询IP是否被禁止时,您可以使用BETWEEN查询。

SELECT * FROM bans WHERE INET_ATON("127.0.0.1") BETWEEN start_ip AND end_ip