有没有办法将IPV4转换为IPV6格式,反之亦然? 当用户注册或登录我的网站时,我将IP地址存储在数据库中。 有时用户的IPV6格式的地址存储。 用户的身份验证是检查IP地址列。但下次用户的IPV4格式的IP地址正在下载。所以在数据库中我没有得到这个IPV4 ip,因为以前存储过IPV6地址。并且用户的身份验证将失败。所以我想将IPV4转换为IPV6。
感谢。
答案 0 :(得分:2)
IPv6不仅仅是一种不同的“格式”。 IPv6是IPv4的完全替代品。 IPv4地址没有“转换”为IPv6地址。您的客户端具有IPv4地址或具有IPv6地址,周期。也许它们甚至都有,但这只是因为它们并行运行两个IP堆栈并且可以通过两种方法到达;两个堆栈完全独立运行,但两者都可能突然独立地改变它们的IP。他们没有相关性。据您所知,每个IP(无论是v4还是v6)都是完全不同的客户端。
简而言之:不。 IPv6是一个全新的地址范围。想象一下,如果IPv4从255
扩展为一个字节的最大值到512
,那么整个新范围256.0.0.0
到512.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