我正在面对PHP 中的$ _SERVER ['REMOTE_ADDR']的问题即使服务器使用IPv4,它也会给出与IPv6类似的值。
任何人都可以帮助我解决这个问题。
我正在面对PHP 中的$ _SERVER ['REMOTE_ADDR']的问题即使服务器使用IPv4,它也会给出与IPv6类似的值。
任何人都可以帮助我解决这个问题。
服务器正在接受IPv6套接字上的连接。某些操作系统可以在IPv6套接字上同时执行IPv4和IPv6。当发生这种情况时,IPv6地址将看起来像是::ffff:192.0.2.123
或::ffff:c000:027b
,这是相同的地址,但是以十六进制写入。
如果你看到这样2a00:8640:1::224:36ff:feef:1d89
IPv6地址,那么你的服务器真的是可达通过IPv6 :-)
无论如何,一切都重新转换为规范的形式,你可以使用类似:
// Known prefix
$v4mapped_prefix_hex = '00000000000000000000ffff';
$v4mapped_prefix_bin = pack("H*", $v4mapped_prefix_hex);
// Or more readable when using PHP >= 5.4
# $v4mapped_prefix_bin = hex2bin($v4mapped_prefix_hex);
// Parse
$addr = $_SERVER['REMOTE_ADDR'];
$addr_bin = inet_pton($addr);
if($addr_bin === FALSE) {
// Unparsable? How did they connect?!?
die('Invalid IP address');
}
// Check prefix
if(substr($addr_bin, 0, strlen($v4mapped_prefix_bin)) == $v4mapped_prefix_bin) {
// Strip prefix
$addr_bin = substr($addr_bin, strlen($v4mapped_prefix_bin));
}
// Convert back to printable address in canonical form
$addr = inet_ntop($addr_bin);
使用此代码,下面的,当你输入一个
:
::ffff:192.000.002.123
::ffff:192.0.2.123
0000:0000:0000:0000:0000:ffff:c000:027b
::ffff:c000:027b
::ffff:c000:27b
192.000.002.123
192.0.2.123
你总是得到卡诺尼卡l IPv4地址192.0.2.123
作为输出。
当然IPv6地址,并得到恢复,作为典型的IPv6地址:2a00:8640:0001:0000:0224:36ff:feef:1d89
成为2a00:8640:1::224:36ff:feef:1d89
等
谢谢。我会做一些过滤IP。 – Brijesh
我试着将所有的例子添加到我的测试脚本中,并且我从不执行前缀的条纹。您的示例代码中是否有太多的0代表您的所有示例? –
不,所有的例子都是有效的。你能显示你的测试脚本吗? –
你确定你的服务器上运行的IPv4? –
这是因为您的Web服务器绑定到[::],而不是0.0.0.0。 –