将IPV4转换为IPV6 php

时间:2015-01-29 06:44:03

标签: php ip ipv6 ipv4

有没有办法将IPV4转换为IPV6格式,反之亦然?  当用户注册或登录我的网站时,我将IP地址存储在数据库中。  有时用户的IPV6格式的地址存储。  用户的身份验证是检查IP地址列。但下次用户的IPV4格式的IP地址正在下载。所以在数据库中我没有得到这个IPV4 ip,因为以前存储过IPV6地址。并且用户的身份验证将失败。所以我想将IPV4转换为IPV6。

感谢。

4 个答案:

答案 0 :(得分:2)

IPv6不仅仅是一种不同的“格式”。 IPv6是IPv4的完全替代品。 IPv4地址没有“转换”为IPv6地址。您的客户端具有IPv4地址或具有IPv6地址,周期。也许它们甚至都有,但这只是因为它们并行运行两个IP堆栈并且可以通过两种方法到达;两个堆栈完全独立运行,但两者都可能突然独立地改变它们的IP。他们没有相关性。据您所知,每个IP(无论是v4还是v6)都是完全不同的客户端。

简而言之:不。 IPv6是一个全新的地址范围。想象一下,如果IPv4从255扩展为一个字节的最大值到512,那么整个新范围256.0.0.0512.512.512.512将变得可用;那就是IPv6。

答案 1 :(得分:0)

听起来您在初始注册过程中将每个用户的IP列入白名单。如果是这种情况,那么您遇到的问题就不容易解决。如果您的用户同时拥有IPv4和IPv6地址,您将无法控制用于连接服务器的用户(除了禁用服务器上的IPv6)。此外,此方法不适用于具有动态IP地址的用户,因为他们将定期获得新的IP并且无法进行身份验证。

无法从其IPv6地址确定用户IPv4地址,因为用户的IPv4和IPv6地址*之间没有保证的相关性。正如其他人所说,IPv6地址不会直接转换为IPv4地址,因为它们是不同的格式。 IPv6地址数量要大得多(128位与32位),因此即使标准允许,也无法将IPv6地址转换为IPv4。

*:我能想到的唯一例外是IPv4和IPv6之间的相关性将在LAN上,每个设备都有一个静态私有IP。如果选择静态IPv4和IPv6地址以便它们以某种方式相关,则可以从v6地址确定v4地址。对于大多数人来说,这不是一个可能的设置,它假设您的服务器与最终用户位于同一本地网络上(因此它会看到私有IP)。

鉴于锁定有效用户的可能性很高(由于动态IP或IPv6),这似乎不是保护服务器安全的可靠方法。如果您具有非常特定的用户群并且动态IP不是问题,则您可以将注册页面绑定到IPv4地址,而不是让它侦听IPv6地址。这样,你至少可以确保在注册时获得他们的IPv4地址。

编辑:重写了我的答案,以更加相关的问题

答案 2 :(得分:-1)

没有关于storaging类型的信息(字符串,二进制)。

你可以尝试这个http://ipv6.ztsoftware.net/ipv4-to-ipv6/,但我不确定这是个好主意。好像这个服务提供二进制转换。如上所述,IPv4和IPv6的格式 - 这是两个不同的事情。

答案 3 :(得分:-1)

累计IPV4to6

我在PHP中为您创建了以下函数,请您继续寻找:

function ipv4to6($ip=false) {

if (!$ip) {
    return;
}

$ipAddressBlocks = explode('.', $ip);

if (count($ipAddressBlocks) == 0) {
    return;
}

$ipv6       = '';
$ipv6Pieces = 0;
foreach ($ipAddressBlocks as $ipAddressBlock) {

    if ($ipv6Pieces%4 == 0 && $ipv6Pieces > 0) {
        $ipv6 .= '::';
    }

    $ipv6Piece = dechex($ipAddressBlock);
    $ipv6 .= (is_numeric($ipv6Piece) && $ipv6Piece < 10 ? '0'.$ipv6Piece : $ipv6Piece);

    $ipv6Pieces = strlen(str_replace('::', '', $ipv6));
}

return $ipv6.'::/48';
}

您可以使用此功能,如:

echo ipv4to6('192.0.2.4');

这将返回:c000 :: 0204 :: / 48