我正在对 Java EE 应用程序进行更改,该应用程序将使用以下方式根据用户的 IP 地址进行身份验证ServletRequest.getRemoteAddr。我们将 IP 地址范围(FROM_IP 和 TO_IP)存储在数据库中,只有当用户的 IP 地址落在某个范围内时,系统才会进行身份验证。
现在,测试人员指出,FROM_IP 和 TO_IP 值中(任何地方)都不应允许使用数字 0(零)。请注意,这是一个面向 Internet 的应用程序,因此我们将仅获取公共 IP 地址。
测试人员建议进行验证是否正确?为什么我们不能在 167.23.0.1 - 167.23.255.255 这样的范围值中使用零?
答案1
不,他们完全错了。
事实上,这是一个有效的 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 网络中的有效主机地址。
答案2
除非我理解错误,否则您的测试人员完全错了。有效 IP 地址中肯定可以包含 0。
答案3
一般来说:不,地址中是否有 0 并不重要。
但是,测试人员说的话也有一定的道理。在某些情况下,旧的或损坏的网络设备无法在最后八位字节为 0 的地址上正常工作。这是由于旧的全类路由规则造成的。在全类路由中,您可以从地址的第一个八位字节中得知网络掩码。如果设备仍然遵循全类路由规则,则可能会错误地处理 200.100.1.0/16 之类的地址。
答案4
提供一个非常简单的答案:只要这些地址不是网络或广播地址,IP 地址中的一个或多个零对于主机地址来说是完全有效的。
网络和广播地址是有效的 IP 地址,只是主机无法使用。