IP — конвертировать IPV4 в переполнение стека IPV6

есть ли способ конвертировать IPV4 в формат IPV6 или наоборот?
Когда пользователь регистрируется или заходит на мой сайт, я сохраняю IP-адрес в базе данных.
иногда хранение адреса в формате IPV6 пользователя.
Аутентификация пользователя проверяется по столбцу IP-адреса. Но в следующий раз пользователь получает IP-адрес в формате IPV4. Так что в базе данных я не получаю этот IPv4 ip, потому что ранее хранил IPV6-адрес. и аутентификация пользователя не удастся. Поэтому я хочу конвертировать IPV4 в IPV6.

Благодарю.

0

Решение

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.

2

Другие решения

Похоже, вы вносите белый список IP-адресов каждого пользователя в процессе первоначальной регистрации. Если это так, то проблема, с которой вы столкнулись, не может быть легко решена. Если у ваших пользователей есть как IPv4, так и IPv6-адрес, вы не сможете контролировать, какие они используют для подключения к вашему серверу (кроме отключения IPv6 на вашем сервере). Кроме того, этот метод не будет работать для пользователей с динамическим IP-адресом, поскольку они будут регулярно получать новый IP-адрес и не смогут проходить проверку подлинности.

Невозможно определить IPv4-адрес пользователя по его IPv6-адресу, поскольку нет гарантированной корреляции между IPv4-адресом пользователя и IPv6-адресом *. Как уже говорили другие, адреса IPv6 не преобразуются напрямую в адреса IPv4, поскольку они имеют разные форматы. Адреса IPv6 — это гораздо большие числа (128-битные по сравнению с 32-битными), поэтому преобразование адреса IPv6 в IPv4 было бы невозможным, даже если бы стандарт позволял это делать.

*: единственное исключение, которое я могу придумать в отношении корреляции между IPv4 и IPv6, будет в локальной сети, где каждое устройство имеет статический частный IP. Если статические адреса IPv4 и IPv6 были выбраны таким образом, чтобы они каким-либо образом коррелировали, тогда можно было бы определить адрес v4 из адреса v6. Однако это маловероятно для большинства пользователей, и предполагается, что ваш сервер находится в той же локальной сети, что и конечные пользователи (чтобы он мог видеть частные IP-адреса).

Учитывая высокую вероятность блокировки действительных пользователей (из-за динамических IP-адресов или IPv6), это не кажется надежным способом защиты вашего сервера. Если у вас очень специфическая база пользователей и динамические IP-адреса не являются проблемой, вы можете привязать свою страницу регистрации к IPv4-адресу, а не прослушивать ее по IPv6-адресу. Таким образом, вы, по крайней мере, можете получить их IPv4-адрес при регистрации.

Редактировать: переписал мой ответ, чтобы быть более относящимся к вопросу

0

Нет информации о типе хранения (строка, двоичный файл).

Вы можете попробовать это http://ipv6.ztsoftware.net/ipv4-to-ipv6/ но я не уверен, что это хорошая идея. Похоже, этот сервис обеспечивает двоичное преобразование. Как сказано выше, формат IPv4 и IPv6 — это две разные вещи.

-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

-1
По вопросам рекламы [email protected]