【发布时间】:2009-10-06 17:53:22
【问题描述】:
在编写登录模块时,我想记录 IP 作为额外的措施,以验证在另一边的人仍然是另一边的同一个人。
我使用$_SERVER['REMOTE_ADDR'] 作为获取远程机器IP 地址的一种(多种)方法。除了 IPv4 或 IPv6 地址之外,我应该期望它返回任何其他值吗?
【问题讨论】:
在编写登录模块时,我想记录 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 相同等。如果网络服务器接受 IPv6 套接字上的 IPv4 连接,IPv4 地址甚至可以用 IPv6 表示法编写,例如 ::ffff:192.0.2.1 或 ::ffff:c000:0201 .我在 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 通常是避免像您所描述的那样的安全问题的最佳方法。祝你的项目好运。
【讨论】: