我可以在PHP中将IP4/6地址标准化为IP6而不进行字符串黑客攻击吗


Can I normalise IP4/6 addresses to IP6 in PHP without string-hacking?

这里和其他地方有很多关于如何在PHP中处理IP4和IP6地址的帖子。

我想写一段代码,将所有IP地址规范化为IP6格式,无论其表示形式如何。

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

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

不,没有任何条件逻辑都无法做到这一点。另一方面,必要的代码并不难:

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地址。