【问题标题】:Can I normalise IP4/6 addresses to IP6 in PHP without string-hacking?我可以在 PHP 中将 IP4/6 地址标准化为 IP6 而不进行字符串黑客攻击吗?
【发布时间】:2016-04-05 20:30:16
【问题描述】:

这里和其他地方有很多关于 PHP 中how to handle IP4 and IP6 地址的帖子。

我想编写代码,将所有 IP 地址(无论其表示形式如何)标准化为 IP6 格式。

我可以通过将各种建议拼凑起来并进行一些字符串破解来做到这一点,但是最佳实践已经从那开始

现代 PHP 中是否有内置函数可以在所有情况下正确执行此操作,我的应用程序代码中没有任何条件逻辑

【问题讨论】:

  • 重复。 ahem:“这里和其他地方有很多帖子......”看到了,想知道“最佳实践是否从那开始?”
  • @spraff 这并不能阻止它成为重复。
  • 问题是“我该怎么做?”这里的问题是“如果不这样做,我该如何做到这一点?”
  • “我想编写不带条件的代码”并不能使其不重复。它只会让你非常挑剔。

标签: php ip ipv6


【解决方案1】:

不,如果没有任何条件逻辑,您将无法执行此操作。另一方面,必要的代码并不难:

function normalise_ip($address, $force_ipv6=false) {
    # Parse textual representation
    $binary = inet_pton($address);
    if ($binary === false) {
        return false;
    }

    # Convert back to a normalised string
    $normalised = inet_ntop($binary);

    # Add IPv4-Mapped IPv6 Address prefix if requested
    if ($force_ipv6 && strlen($binary) == 4) {
        $normalised = '::ffff:' . $normalised;
    }

    return $normalised;
}

你可以这样测试:

$addresses = array(
    '192.000.002.001',
    '2001:0db8:0000:0000:0000:0000:0000:0001',
);

foreach ($addresses as $original) {
    $normalised = normalise_ip($original);
    $normalised_ipv6 = normalise_ip($original, true);

    echo "Original: $original; ";
    echo "Normalised: $normalised; ";
    echo "As IPv6: $normalised_ipv6\n";
}

如果您将结果强制为 IPv6,您将获得 IPv4 映射的 IPv6 地址而不是 IPv4 地址。

【讨论】:

  • inet_pton(): Unrecognized address 192.000.002.001
  • @spraff 试试192.0.2.1
  • 有趣的是,这是一个完全有效的符号,它适用于我的系统。显然,一些 inet_pton 实现被破坏了:(
猜你喜欢
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
  • 2013-11-16
  • 2011-06-18
相关资源
最近更新 更多