Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将IPV4转换为IPV6 php_Php_Ip_Ipv6_Ipv4 - Fatal编程技术网

将IPV4转换为IPV6 php

将IPV4转换为IPV6 php,php,ip,ipv6,ipv4,Php,Ip,Ipv6,Ipv4,有没有办法将IPV4转换为IPV6格式,或者将IPV4转换为IPV6格式? 当用户注册或登录到我的站点时,我将IP地址存储在数据库中。 有时,用户的IPV6格式地址存储。 用户的身份验证正在检查ip地址列。但下一次用户的IPV4格式的ip地址被获取时。所以在数据库中,我并没有得到这个IPV4 ip,因为以前存储了IPV6地址。用户的身份验证将失败。所以我想把IPV4转换成IPV6 谢谢。没有关于存储类型(字符串、二进制)的信息 你可以试试这个,但我不确定这是个好主意。似乎这个服务提供了二进制转换

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


谢谢。

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


你可以试试这个,但我不确定这是个好主意。似乎这个服务提供了二进制转换。如上所述,IPv4和IPv6的格式——这是两件不同的事情

IPv6不仅仅是一种不同的“格式”。IPv6完全取代了IPv4。IPv4地址不存在到IPv6地址的“转换”。您的客户端具有IPv4地址或IPv6地址句点。也许他们两个都有,但那只是因为他们并行运行两个IP堆栈,并且可以通过这两种方法访问它们;尽管两个堆栈完全独立运行,但它们可能会突然独立更改IP。它们不相关。据您所知,每个IP(无论是v4还是v6)都是一个完全不同的客户端


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

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

编辑:重写我的答案,使之与问题更加相关

我在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';
}

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

欢迎使用堆栈溢出。请参阅如何询问页面。您需要提供一些有关您迄今为止所尝试的内容的信息。由于这些类型彼此不相关,因此不可能“转换”这些类型。IPv6是一种全新的IP形式,并不是从IPv4地址创建的。更可能的情况是,他将IP地址用作会话标识符的一部分,这会在用户在IPv4和IPv6之间切换时导致cookie无效。您获得的IPv6地址,
c000::0204::/48
,是保留的且未路由。IPv4可以有效地表示为IPv6地址。它的工作方式与用十六进制表示十进制数相同<例如,
0.0.0.1
将是
0000:0000:0000:0000:ffff:0000:0001
123.123.123
将是
0000:0000:0000:0000:ffff:7b7b
。事实上,将大多数IPv6地址转换为IPv4是不可能的,但反过来是100%可能的。这基本上是正确的,但它会路由到同一台机器吗?如果没有这一保证,这种做法是毫无意义的。是的,很好,但如果你得到任何随机IP地址,您知道它可以通过这种方式映射到另一个堆栈中的地址,该堆栈路由到同一台机器吗?你基本上没有。只有当你知道自己身处一个能做出这样保证的堆栈中时,你才能这样做,而interweb通常不是这样。是的,因此,如果你处于一个可以保证映射的特定情况下,那么是的,你可以。但一般情况并非如此。
echo ipv4to6('192.0.2.4');