Я работаю над изменением приложения Java EE, которое будет аутентифицироваться на основе IP-адреса пользователя, используя ServletRequest.getRemoteAddr. Мы храним диапазоны IP-адресов (FROM_IP и TO_IP) в базе данных, и система будет аутентифицироваться, только если IP-адрес пользователя попадает в диапазон.
Теперь тестировщики указали, что цифра 0 (ноль) не должна допускаться в значениях FROM_IP и TO_IP (в любом месте). Обратите внимание, что это приложение для выхода в Интернет, поэтому мы получим только общедоступные IP-адреса.
Правы ли тестировщики, предлагая такую проверку? Почему у нас не может быть ноль в значении диапазона, таком как 167.23.0.1 - 167.23.255.255?
Нет, они совершенно неверны.
Фактически, это действующий IP-адрес: 192.168.24.0
Как есть 167.23.0.1
.
Разделение IP-адреса на сегменты с точками - это чисто человеческое удобство для отображения. Намного легче запомнить 192.168.1.42
чем 3232235818
.
Для компьютеров важно разделение (сетевая маска). Недопустимо иметь адрес хоста с разделом хоста адреса, полностью установленным на 0 или 1.
Итак, 192.168.24.0, если сетевая маска такова, что некоторые биты устанавливаются в части хоста. См. Следующие расчеты:
michael@challenger:~$ ipcalc 192.168.24.0/16
Address: 192.168.24.0 11000000.10101000. 00011000.00000000
Netmask: 255.255.0.0 = 16 11111111.11111111. 00000000.00000000
Wildcard: 0.0.255.255 00000000.00000000. 11111111.11111111
=>
Network: 192.168.0.0/16 11000000.10101000. 00000000.00000000
HostMin: 192.168.0.1 11000000.10101000. 00000000.00000001
HostMax: 192.168.255.254 11000000.10101000. 11111111.11111110
Broadcast: 192.168.255.255 11000000.10101000. 11111111.11111111
Hosts/Net: 65534 Class C, Private Internet
В этом случае в адресной части (правая сторона) установлено 2 бита. Это действительный адрес хоста в подсети 192.168.0.0/16.
michael@challenger:~$ ipcalc 192.168.24.255/16
Address: 192.168.24.255 11000000.10101000. 00011000.11111111
Netmask: 255.255.0.0 = 16 11111111.11111111. 00000000.00000000
Wildcard: 0.0.255.255 00000000.00000000. 11111111.11111111
=>
Network: 192.168.0.0/16 11000000.10101000. 00000000.00000000
HostMin: 192.168.0.1 11000000.10101000. 00000000.00000001
HostMax: 192.168.255.254 11000000.10101000. 11111111.11111110
Broadcast: 192.168.255.255 11000000.10101000. 11111111.11111111
Hosts/Net: 65534 Class C, Private Internet
В этом случае в адресной части установлено 10 бит и не установлено 6 бит. Это еще один действительный адрес хоста в той же подсети.
michael@challenger:~$ ipcalc 192.168.24.0/24
Address: 192.168.24.0 11000000.10101000.00011000. 00000000
Netmask: 255.255.255.0 = 24 11111111.11111111.11111111. 00000000
Wildcard: 0.0.0.255 00000000.00000000.00000000. 11111111
=>
Network: 192.168.24.0/24 11000000.10101000.00011000. 00000000
HostMin: 192.168.24.1 11000000.10101000.00011000. 00000001
HostMax: 192.168.24.254 11000000.10101000.00011000. 11111110
Broadcast: 192.168.24.255 11000000.10101000.00011000. 11111111
Hosts/Net: 254 Class C, Private Internet
В этом случае в адресной части установлены нулевые биты. Это недопустимый адрес хоста в сети 192.168.24.0/24.
Если я не ошибаюсь, ваши тестеры совершенно неправы. Действительные IP-адреса, безусловно, могут содержать 0.
В общем: Нет, не имеет значения, есть ли в адресе 0 или нет.
Однако в том, что говорят ваши тестировщики, есть доля правды. В некоторых случаях старое или сломанное сетевое оборудование не будет правильно работать на адресах с 0 в последних октестах. Это связано со старыми правилами классовой маршрутизации. В маршрутизации Classfull маску сети можно определить по первому октету адреса. Если оборудование по-прежнему следует правилам маршрутизации по классам, скорее всего, оно будет неправильно обрабатывать адрес типа 200.100.1.0/16.
Допустим, вам нужно 510 IP-адресов в одном диапазоне, а ваш сетевой адрес - 192.1.1.0, у вас будет подсеть / 23, из которых один из IP-адресов вашего хоста является IP-адресом .0, ваши тестеры ошибаются, если адрес .0 это адрес хоста. Если у вас сеть / 24, будет правильно сказать, что это неправильно.
Чтобы дать очень простой ответ: один или несколько нулей в IP-адресе вполне допустимы для адресов хоста, если эти адреса не являются сетевым или широковещательным адресом.
Сетевые и широковещательные адреса являются действительными IP-адресами, они просто не могут использоваться хостами.