【问题标题】:Convert IPV4 to IPV6 php将 IPV4 转换为 IPV6 php
【发布时间】:2015-03-28 07:28:52
【问题描述】:

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

谢谢。

【问题讨论】:

  • 欢迎来到 Stack Overflow。请参阅如何提问页面。您需要提供一些关于您迄今为止尝试过的信息。
  • “转换”这些类型是不可能的,因为它们彼此不相关。 IPv6 是一种全新的 IP 形式,不是从 IPv4 地址创建的。

标签: php ip ipv6 ipv4


【解决方案1】:

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

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

【讨论】:

  • IPv4 可以有效地表示为 IPv6 地址。它的工作方式与用十六进制表示十进制数相同。例如,0.0.0.1 将是 0000:0000:0000:0000:0000:ffff:0000:0001123.123.123.123 将是 0000:0000:0000:0000:0000:ffff:7b7b:7b7b。事实上,将大部分 IPv6 地址转换为 IPv4 是不可能的,但反过来是 100% 可能的。
  • 基本正确,但 它会路由到同一台机器吗‽ 没有这种保证,这种练习毫无意义。
  • 是的,很好,但是如果你得到任何随机的 IP 地址,你知道它可以通过这种方式映射到另一个堆栈中路由到同一台机器的地址吗?你大多没有。只有当您知道自己处于做出此类保证的堆栈中时,您才能这样做,而互联网通常不是这种情况。
  • 是的,所以,如果您处于可以保证映射的特定情况,那么是的,您可以。但通常情况并非如此。
【解决方案2】:

听起来您在初始注册过程中将每个用户的 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 地址。

编辑:改写了我的答案以更贴近问题

【讨论】:

  • 更有可能是他将 IP 地址用作会话标识符的一部分,这最终导致用户在 IPv4 和 IPv6 之间切换时 cookie 无效。
【解决方案3】:

没有关于存储类型(字符串、二进制)的信息。

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

【讨论】:

    【解决方案4】:

    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

    【讨论】:

    • 您获得的 IPv6 地址 c000::0204::/48RESERVED 并且没有路由。
    猜你喜欢
    • 2018-01-23
    • 2015-03-10
    • 2011-01-03
    • 2019-09-22
    • 1970-01-01
    • 2017-12-17
    • 2020-11-06
    • 2010-12-06
    • 1970-01-01
    相关资源
    最近更新 更多