В моей системе есть сторонний ящик, который хранит IP-адреса и сравнивает их со значениями, отправленными из моего веб-интерфейса. У меня проблема с тем, что пользователь ввел маску сети для стороннего ящика как 255.255.255.000, а ящик сохранил его как 255.255.255.0. Однако в следующий раз, когда блок перезагружается и ему сообщают, что маска содержит 000, он приходит к выводу, что эти значения отличаются, и обновляет свою базу данных и перезагружается. И перезагружается. И перезагружается.
Мое намерение состоит в том, чтобы решить эту проблему, сохранив маску сети в моей собственной системе в упрощенной форме 255.255.255.0 (и в качестве другого примера сохраните 010.001.002.005 как 10.1.2.5). Но я новичок в PHP. Я пробовал код $mask = long2ip(ip2long($mask))
преобразовать запись в стандартизированную форму, но только вернул 0.0.0.0. Что-то особенное, что мне нужно сделать, чтобы конвертировать IP в long и обратно? Есть ли лучший способ упростить это?
Чтобы следовать предложению @ka_lin в комментариях, просто разбейте его на части, преобразуйте в int, которое будет отбрасывать начальные 0, и перестроите его с помощью implode …
$mask = implode(".", array_map("intval", explode(".", $mask)));
Простая и менее затратная версия предполагает 4 части IP-адреса …
list ($o1, $o2, $o3, $o4) = explode(".", $mask);
$mask = (int)$o1.".".(int)$o2.".".(int)$o3.".".(int)$o4;
Это сложно, поскольку 010.001.002.005 является действительным IP-адресом, но также может сбивать с толку (иногда числа, начинающиеся с 0, являются восьмеричными).
ip2long
возвращает false при ошибке, и кажется, что 000 не является действительным. поскольку 255.255.255.000
не определен как действительный IP, он вернет false, поэтому long2ip(false)
не выложит действительный IP.
Вы можете просто проверить это ip2long(input)
возвращает true, даже не принимая IP-адрес. Наличие надлежащей проверки на месте предотвратит взлом системы с помощью недопустимых IP-адресов. Попытка реализовать автокоррекцию для всех возможных недопустимых IP-адресов будет гораздо сложнее, чем просто принудительно ввести действительный IP-адрес.
Записка: ip2long()
имеет проблему: он не принимает действительный IP-адрес 127.1
(классическая запись, но действительная!) или 127.0.0.010
(RFC говорит недействительным, но большинство читают 010
как восьмеричное число).
Альтернатива, если gethostbyname()
, Но gethostbyname()
также имеет проблемы: если введен неверный IP-адрес (например, 127.0.0.1234
), он делает поиск DNS и возвращает источник, если поиск не удается.
Решение может быть:
long2ip(ip2long(gethostbyname($IP_ADDRESS)))
Мое личное решение — следующая функция:
function aton ( $addr )
{
$l = explode('.',$addr);
switch (count($l))
{
case 0: return FALSE;
case 1: return intval($l[0]) & 0xffffffff;
case 2: return ( intval($l[0]) << 24
| intval($l[1])
) & 0xffffffff;
case 3: return ( intval($l[0]) << 24
| intval($l[1]) << 16
| intval($l[2])
) & 0xffffffff;
default: return ( intval($l[0]) << 24
| intval($l[1]) << 16
| intval($l[2]) << 8
| intval($l[3])
) & 0xffffffff;
}
}
С помощью этой функции вы можете использовать:
long2ip(aton($IP_ADDRESS))
Кстати, у меня никогда не было проблем со специальными IP-адресами, такими как 255.255.255.0
,