【问题标题】:Invalid IP Address with multi-line IP Address具有多行 IP 地址的无效 IP 地址
【发布时间】:2016-12-01 22:08:36
【问题描述】:

我在尝试读取包含由新行分隔的 IP 地址的文件时遇到此错误。我想要做的是阅读我的包含一堆 IP 的文件并检查它们是否有正确的记录。这是我的代码:

$file = "test.sh";

if (is_file($file) && is_readable($file)) {
    $get_file_data = file_get_contents($file);

    $turn_to_array = explode("\n", $get_file_data);

    foreach ($turn_to_array as $key => $value) {

        if (filter_var($value, FILTER_VALIDATE_IP)) {
            echo gethostbyaddr(trim($value));
        } else {
            echo "IP invalid";
        }
    }
}

我的 test.sh 文件如下所示:

编辑: 示例 IP

180.1.1.1
181.1.1.2

我需要添加一些特定的测试来解析文件还是有其他问题?

使用非常独特的方法导致的错误:

警告:gethostbyaddr():地址不是有效的 IPv4 或 IPv6 PHP

解决了。

我的代码正常工作,我没有正确获取 rdns 记录,因为这些 IP 不存在它。我用 host 185.1.1.1 检查了它,它返回的是实际 IP 而不是域。然后检查我确信他们有 PTR 记录的 IP,然后它就醒了。但我不确定实际上是如何修复错误的。

【问题讨论】:

  • 在这种情况下使用PHP_EOL 时要小心。您运行它的服务器可能是 *nix 并使用 \n,但该文件可能是在 Windows 上生成的,因此具有 \r\n
  • 只使用file( 而不是file_get_contents 和explode(PHP_EOL。还要var_dump 你的变量$value 来确认它是否符合预期。
  • @TessellatingHeckler x.x.x 只是 IP 的掩码。我正在测试我的 Debian。
  • @MilosM,但您的文件是否包含180.x.x.x?或者它是否包含一堆符合该模式的真实 IP 地址,例如180.1.2.3?
  • 在检查之前尝试trimming 您的 IP 地址。

标签: php ip gethostbyaddr


【解决方案1】:

老实说,我认为爆炸原始文件数据并希望获得最好的结果可能不是实现这一目标的最佳方式。相反,您应该尝试使用正则表达式提取所需的确切数据,以便确定您提取的是正确的值。

试试这样的:

$data = file_get_contents($file);

// This regex matches things that resemble an IP4 address
if (preg_match_all("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/", $data, $addresses)) {

    foreach ($addresses as $address) {

        // Need to verify it ACTUALLY is a valid IP address
        if (filter_var($address, FILTER_VALIDATE_IP)) { 

            echo gethostbyaddr($address);

        }

    }

}

注意:这里使用的正则表达式是由@alex 编写的:Regex to match an IP address

如果这没有帮助,则可能是配置问题。其他一些可能有助于排除故障的检查事项包括:

  • gethostbyaddr('127.0.0.1'); 会抛出同样的错误吗?
  • 您是否有阻止 DNS 请求通过的防火墙?
  • 能否使用服务器中的dig 命令来查找IP?

【讨论】:

  • 这也是一个不正确的正则表达式,因为它会匹配 333.444.555.666 这不是一个有效的 IP。
  • @Jeremy Harris 也尝试了您的版本,添加了额外的检查是否正则表达式为真,但验证失败。它也无法使用 FILTER_VALIDATE_IP 进行验证。这是我的 php 版本:PHP 5.6.24-0+deb8u1
  • 我添加了 filter_var 代码,您必须使用它来确保它是有效的 IP4 地址,但听起来您尝试过,但没有成功。
  • @MilosM 这有帮助吗?你接受了答案。如果是这样,最终的问题是什么?我真的很好奇。
  • @JeremyHarris 老实说,我不知道。但是到目前为止,您和我的解决方案都有效。如果我不通过 regex 或 filter_var 进行额外检查,则会引发警告,但脚本会以两种方式正确执行。现在困扰我的是,bot if else 语句是 true ,因为我收到 rnds 和 IP 验证失败的错误..
猜你喜欢
  • 2014-08-15
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 2019-03-22
  • 2015-06-26
相关资源
最近更新 更多