0

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

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

如果我使用 .htaccess 的拒绝命令,我已完全阻止用户访问我们的任何网站。因此,我必须在 PHP 中进行,因为我有更多的灵活性。我所做的是将这些 IP 范围存储在一个文件中,并且每次将用户的 IP 与文件中的 IP 进行比较。但我的印象是这不是一个最好的主意。请让我知道最快的方法是什么以及如何。谢谢

4

3 回答 3

1

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

生成您的数据库表并为 IP 的不同部分使用 5 列。这需要每月或在您想要更新列表时进行。这可以使用您选择的脚本语言并使用 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)
于 2013-03-04T11:07:37.480 回答
0

似乎它已经在给定 IP 范围/掩码的匹配 IPv4 地址上得到了回答?

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

于 2013-03-04T11:03:05.200 回答
0

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

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

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

于 2013-03-04T11:01:12.073 回答