在编写登录模块时,我想记录 IP 作为额外的措施,以验证另一侧的人仍然是另一侧的同一个人。
我正在使用$_SERVER['REMOTE_ADDR']
一种(多种)方法来获取远程机器的 IP 地址。除了 IPv4 或 IPv6 地址之外,我还应该期望它返回任何其他值吗?
根据 PHP 在线文档,只应返回一个 IP 地址。
http://us.php.net/manual/en/reserved.variables.server.php
“'REMOTE_ADDR':
用户查看当前页面的 IP 地址。”
该值可以是 IPv4 或 IPv6 地址。尽管您可能只会获得规范值,但请注意 IP 地址可以以多种方式写入。192.0.2.1
与 相同192.000.002.001
,2001:db8::1
与 相同2001:0db0:0000:0000:0000:0000:0000:0001
,等等。IPv4 地址甚至可以用 IPv6 表示法编写,::ffff:192.0.2.1
或者::ffff:c000:0201
如果网络服务器接受 IPv6 套接字上的 IPv4 连接。我在 Linux 系统上看到了很多。
只要您保留足够的空间,记录 IP 地址应该不是问题。实际上,如今使用 IP 地址进行访问控制变得越来越棘手。因为世界上大部分地区已经用完了新的 IPv4 地址,所以您会看到 ISP 必须大规模使用 NAT 才能将新客户连接到 IPv4 互联网。这些大规模的 NAT 将使用公共 IPv4 地址池供数千名客户使用。许多客户可以使用一个 IP 地址,而一位客户最终可能会使用池中的不同地址。
在 IPv6 跟踪中,IP 地址还有其他需要考虑的因素。最初的 IPv6 自动配置机制基于使用 MAC 地址作为 IPv6 地址的一部分。由于隐私问题,大多数操作系统现在使用(某种)随机生成的接口标识符(通常是地址的最后 64 位)用于传出连接,并且这些位可以/将随着时间而改变。一些操作系统 (Mac OS X) 甚至会统计 IPv4 或 IPv6 是否更快,我看到客户端有时会在 IPv4 和 IPv6 之间来回切换。
然后您可以让用户从一个无线热点或办公网络漫游到另一个,从而切换 IP 地址。
因此,我认为根据您想要对数据执行的操作,记录 IP 地址可能是有意义的,但是将它们用作(一部分)访问控制形式可能会带来比其价值更多的麻烦。
检查 IP 地址实际上并没有增加安全性,因为这些地址很容易被欺骗,任何精通拦截 POST 交易的人都可能会这样做。
此外,您可能会惹恼合法用户。想想一个人可能在一个有几个免费开放 wifi 热点的位置的例子。当他们到达您的登录页面时,他们可能已连接到一个热点,但当他们登录时,他们的机器可能已经决定另一个路由器是更好的选择,因此他们的 IP 将会改变。信不信由你,这可能会阻止一些(尽管很少)容易受挫的用户。
老实说,我只是不会打扰。如果可以的话,使用 SSL 通常是避免像您所描述的那样的安全问题的最佳方法。祝你的项目好运。