将访问者的IP与范围IP列表进行比较的最快方法

时间:2013-03-04 10:53:20

标签: php ip

让我通过举个例子解释一下我会做些什么。让我们假设我们愿意 阻止(禁用或隐藏)我们的某些网站脚本给来自特定国家/地区的用户 我可以从here获取该国家/地区的IP列表。这给了我表格中的ip范围 aa.bb.cc.0 / 33 kk.ss.yy.0 / 24 等

但是,我正在寻找比较PHP中列表的访问者ip againts的最快方法。 我应该将该列表存储在文件中吗?或者必须将ips存储在db?

如果我使用.htaccess的deny命令,我完全阻止用户访问我们的任何网站。因此我必须在PHP中做到这一点,我有更多的灵活性。 我所做的是将这些ips范围存储在一个文件中,每次将用户的ip与文件中的ip进行比较。但我觉得这不是一个好主意。请让我知道什么以及如何以最快的方式。感谢

3 个答案:

答案 0 :(得分:1)

如果必须使用PHP,则将阻止的IP范围列表存储在数据库中。这将是查找此信息的最快方法之一,而不是从静态PHP代码中读取文本文件或生成哈希映射(这也很难更新)。为了提高查询速度,请在字段上正确使用索引并使用缓存,因为可能相同的IP地址会查看您网站上的多个页面。

生成数据库表并使用5列来表示IP的不同部分。这需要每月或每当您想要更新列表时完成。这可以使用您选择的脚本语言并使用cron或类似的东西来完成。

blocked_tbl:
classA   classB   classC    min    max
------   -------  ------   ----- ------
214       101       99       1     255
178       22        45       1     255
...       ...       ...     ...    ...

然后您可以将网站访问者的IP地址与该范围进行比较,如下所示: (使用substr方法将PHP中的ip地址拆分为4个部分或者爆炸, 所以你有$ ipA,$ ipB,$ ipC和$ ipD)

SELECT count(*) FROM blocked_tbl WHERE
blocked_tbl.classA = $ipA AND
blocked_tbl.classB = $ipB AND
blocked_tbl.classC = $ipC AND
(blocked_tbl.min <= $ipD AND blocked_tbl.max >= $ipD)

答案 1 :(得分:0)

最好的方法是将IP列表存储在数据库中,将IP列作为主键,并检查表中用户IP的出现。

另一种方式(没有数据库)是创建IP的哈希表,并在O(1)中检查用户IP的出现。

显然你必须在检查之前对你的IP进行网络屏蔽......

答案 2 :(得分:0)

似乎已经在Match IPv4 address given IP range/mask?

上回答了问题

至于如何存储它们,我不会为此设置数据库。也许你读入数组的平面文本文件?如果您已经拥有数据库,是的,请使用它!