【问题标题】:Fastest way of comparing the visitor's IP against a list of range IPs将访问者的 IP 与范围 IP 列表进行比较的最快方法
【发布时间】:2013-03-04 10:53:20
【问题描述】:

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

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

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

【问题讨论】:

  • 如果可以通过适当的服务器配置完成此操作,为什么还要使用 PHP?
  • 如果您想要快速并发查找,使用普通文件将很难获得。
  • @raina77ow 我不喜欢在服务器配置中这样做的原因:1-我想在我的代码中根据它做出决定。即在 php 代码的 if-else 块中使用它来禁用某些功能或启用其他一些功能 2-我的文件托管在共享服务器中,我无法完全控制参数

标签: php ip


【解决方案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)

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      好像已经在Match IPv4 address given IP range/mask?回复了

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

      【讨论】:

        猜你喜欢
        • 2017-03-04
        • 2015-08-31
        • 2016-09-27
        • 1970-01-01
        • 1970-01-01
        • 2013-07-14
        • 2014-08-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多