当前位置: 首页 > 知识库问答 >
问题:

在PHP中获取范围内的所有IP地址

牛兴安
2023-03-14

我有来自Microsoft Azure数据中心(http://www.microsoft.com/en-us/download/confirmation.aspx?id=41653)的900个IP地址范围,我想知道IP地址是否来自其中一个地址。我已经把它转换成一个列表,可以存储在文本文件中。

所以:循环遍历每个地址并使用ip2long()如这里的第3点是否成本更高(https://mebsd.com/coding-snipits/php-ipcalc-coding-subnets-ip-addresses.html)还是转换范围内的所有IP地址,将它们存储在数据库中,然后查找它们更好?如果是后者,如何实现这一点(即将一个范围转换为其中的所有IP地址)?

对我来说,关键是它必须快,因为我们会经常检查这个。

示例IP地址/范围:

40.112.124.0/24
65.52.128.0/19
94.245.97.0/24
104.47.169.0/24
104.214.240.0/24
137.116.192.0/19
157.55.8.96/27
157.55.8.128/27
157.55.8.160/28
168.63.0.0/19

共有1个答案

昌琪
2023-03-14

哇,列表中几乎有1000个IP范围!为了优化验证单个IP地址是否在其中一个IP范围内,您肯定应该对IP范围列表进行一些预处理。创建数据库是一种方法。我认为SQLite是一种超快速的本地文件格式,对于像这样的只读任务,它比向运行数据库的另一个进程(或机器)发送查询更快。

创建一个包含列“range\u start”和“range\u end”以及这些列上的索引的表。对于每个IP地址范围,插入一行,其中包含范围的开始和结束。完成后,您的行数将少于1000行。现在,要测试IP地址。。。

SELECT * FROM IP_RANGES WHERE $testIP>=range_start AND $testIP<=range_end

(修改此SQL语句以匹配调用数据库的方式,最好使用PDO,最好使用SQL注入安全的方式)。

更新:抱歉,在我键入答案时错过了上面的评论。

@Ukuser32,是的,使用ip2long将点十进制转换为长整数(更易于使用;在数据库中存储长整数)。要想了解范围的尽头,请查看苹果酒的第二部分。它是在该范围内固定的位数(N),从左边开始。这意味着32-N是可变位的数量。这意味着该范围内有2个**(32-N)IP。这意味着可以计算$range\u end。。。

list($range_start, $range_end) = cidr2range('40.112.124.0/24');
echo "Start: $range_start, end: $range_end\n";

function cidr2range($cidr) {
    $cidr = explode('/', $cidr);
    $range_start = ip2long($cidr[0]);
    $range_end = $range_start + pow(2, 32-intval($cidr[1])) - 1;
    return [$range_start, $range_end];
}
 类似资料:
  • 问题内容: 有没有办法获取所有当前在javascript范围内的变量? 问题答案: 否。“范围内”变量由“作用域链”确定,该变量无法通过编程方式访问。 有关详细信息(很多),请查看ECMAScript(JavaScript)规范。这是指向官方页面的链接,您可以在其中下载规范规范(PDF),而这是指向官方的可链接HTML版本的链接。 根据您对Camsoft的评论进行更新 事件函数作用 域中 的变量取

  • 我有一个IP地址,另外两个IP地址一起创建了一个IP范围。我想检查第一个IP地址是否在此范围内。如何在PHP中找到它?

  • 问题内容: 我想知道如何在给定父范围的情况下获取所有子范围的列表。我可以从该范围的属性中找到$ childHead,$ childTail,$ nextSibling和$$ prevSibling。 我现在使用的方法是从父级获取childHead,然后使用nextSibling获取下一个孩子,直到nextSibling为空。 有没有更好的方法?鉴于我想在所有子项上调用方法[getModel],是否

  • 我想展示一个IP的两个第一范围。例如,我127.0.0.1。我想得到127.0并使用这个例子: show show 我怎么能那样做? 我尝试了,但它显示了整个IP地址。

  • 问题内容: 我有一个IP地址,并给了我另外两个IP地址,它们一起创建了IP范围。我想检查第一个IP地址是否在此范围内。如何在PHP中找到答案? 问题答案: 有了它可以轻松地将地址转换为数字。之后,您只需要检查数字是否在范围内:

  • 在包含所有数据的生产性系统上。 是否有一个(最好是cql)查询可以与给定的列族或de一起平稳运行,我们必须更改设计?