不同浏览器,不同IP地址?

11

我通过将$_SERVER['REMOTE_ADDR']的值保存到MySQL数据库中来保存用户的IP地址。问题是对于Firefox和Chrome,$_SERVER['REMOTE_ADDR']都是::1(这意味着IPv6的本地主机),而对于IE和Opera,则为127.0.0.1(IPv4)。

所以,我的问题是:

  • IP版本与浏览器有关吗?(我曾认为它取决于计算机)

  • 我应该在数据库中创建两个字段,一个用于IPv4地址,一个用于IPv6地址吗?

  • 我应该统一所有IP地址为IPv6吗?如何在PHP中实现此操作(如果可能的话)?

3个回答

6
  1. 很明显,您的盒子支持IPv6,Firefox/Chrome尽可能使用IPv6,而IE和Opera不支持或默认关闭此功能。

  2. 将地址存储在足够长以容纳IPv6地址的字符串中。

  3. 一般情况下是不行的。


但是... IP 不是只是不同的表示方式吗?我的意思是,如果一个网页在 Chrome 中通过 IP 禁止了我,那么用 Opera 登录就可以绕过它吗? - federico-t
2
不是的。这是两种具有两个不同地址空间的网络传输方式。在一个双协议网络中,您拥有IPv6地址和IPv4地址,这两个地址可能匹配,也可能不匹配,这取决于网络设置。 - Seva Alekseyev
1
@John Doe:理论上是可以的。你会有两个不同的IP地址,因此阻止其中一个仍然可以让另一个通过。但实际上可能不行。目前支持IPv6的网站并不多,提供IPv6连接而无需隧道/封装的ISP也很少。 - Marc B
好吧,我想我会将每个IP(v4或v6)保存在一个VARCHAR(37)中(这是通用IPv6的长度)。虽然听起来非常低效,但无论如何...... - federico-t
@JohnDoe:这个问题表明最大可能长度为39个字符。至于低效率方面:请将您的地址以紧凑的二进制格式存储(每个地址只需要16个字节)。 - knittl
没错,它有39个字符:8个由7个冒号分隔的4位十六进制数字块=(8 * 4)+ 7 = 39。这是最大长度,IPv6也可以缩写-请参见“地址表示”http://en.wikipedia.org/wiki/IPv6前导零和连续零可以被删除。 - codercake

2
使用PHP函数inet_pton将人类可读的IP地址转换为它们的打包表示形式。然后,您可以将每个IP地址存储在数据库中的BINARY(16)VARBINARY(16)字段中。请注意保留HTML标签。

2
浏览器将使用可用的任何内容。这可以是IPv4或IPv6,甚至在会话期间可能会改变。此外,请记住主机可以拥有许多IPv6地址,因此在会话期间也可能会发生更改。
简而言之:不要过度依赖REMOTE_ADDR的值 :-)

是的,我已经被告知过很多人可能共享同一个IP地址等情况,但在这种情况下准确性对我来说并不是非常重要,所以我会放过它。 - federico-t
@JohnDoe:这不仅仅是“极端”准确性的问题——许多办公室、WiFi热点、家庭网络等只使用一个IP地址来覆盖整个网络。如果你关心在同一家星巴克上使用不同笔记本电脑的两个不同用户的区分,那么你不应该通过IP地址来识别他们。 - Daniel Pryden
1
@JohnDoe,你提到的恰好与我所说的相反:你谈论多个用户使用同一个IP地址,而我则是在谈论一个用户使用多个(IPv4和/或IPv6)地址。这可能是因为某人拥有多个IPv6地址,因为他们在NAT444网关后面有多个公共IPv4地址,或者因为用户在这些IPv4和IPv6地址之间切换。 - Sander Steffann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接