让我通过举个例子解释一下我会做些什么。让我们假设我们愿意 阻止(禁用或隐藏)我们的某些网站脚本给来自特定国家/地区的用户 我可以从here获取该国家/地区的IP列表。这给了我表格中的ip范围 aa.bb.cc.0 / 33 kk.ss.yy.0 / 24 等
但是,我正在寻找比较PHP中列表的访问者ip againts的最快方法。 我应该将该列表存储在文件中吗?或者必须将ips存储在db?
中如果我使用.htaccess的deny命令,我完全阻止用户访问我们的任何网站。因此我必须在PHP中做到这一点,我有更多的灵活性。 我所做的是将这些ips范围存储在一个文件中,每次将用户的ip与文件中的ip进行比较。但我觉得这不是一个好主意。请让我知道什么以及如何以最快的方式。感谢
答案 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?
上回答了问题至于如何存储它们,我不会为此设置数据库。也许你读入数组的平面文本文件?如果您已经拥有数据库,是的,请使用它!