我有一个相当大的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。*”也会导致不必要地禁止大量用户。
有没有办法有效地做到这一点?
答案 0 :(得分:5)
为什么不使用netmasks?
这种方式只需要5个字节的IPv4地址。如果你想要掩盖你的狡猾,那就做8个字节。
通过简单地将掩码与IP进行对比,可以非常快速地进行比较。这就是IP路由的工作原理。
此外,您可以使用MySQL函数INET_NTOA和INET_ATON将点格式的IP地址转换为数字格式,然后再返回,从而使存储高效且易于使用。 / p>
答案 1 :(得分:1)
我会有一个这样的表:
range | start_number | end_number
------+--------------+-----------
其中包含(例如):1.2.3
,4
和54
。
然后,您可以轻松检查连接的IP地址是否在该范围内,以及最后一部分是否在start_number
和end_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