2012-09-15 55 views
5

我正在面对PHP 中的$ _SERVER ['REMOTE_ADDR']的问题即使服务器使用IPv4,它也会给出与IPv6类似的值。

任何人都可以帮助我解决这个问题。

+0

你确定你的服务器上运行的IPv4? –

+2

这是因为您的Web服务器绑定到[::],而不是0.0.0.0。 –

回答

15

服务器正在接受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

+0

谢谢。我会做一些过滤IP。 – Brijesh

+0

我试着将所有的例子添加到我的测试脚本中,并且我从不执行前缀的条纹。您的示例代码中是否有太多的0代表您的所有示例? –

+0

不,所有的例子都是有效的。你能显示你的测试脚本吗? –

相关问题