如何掩盖ip的最后8位数

时间:2018-05-23 08:21:58

标签: php

我正在研究民意调查系统。我想限制用户根据他们的IP地址只投票一次,但为了保持用户ip私密我需要隐藏IP地址的最后8位数。我想要实现的一个示例是将此150.62.48.220更改为15x.xx.xx.xxx。我希望有人知道隐藏IP地址的最后8位数的答案。

2 个答案:

答案 0 :(得分:0)

我有两种方法可以做到,一种只适用于IPV4地址,另一种适用于IPV4和IPV6。

$ip = "128.123.1.2";

echo rtrim(long2ip(ip2long($ip) & (~255)),"0")."x".PHP_EOL; // 128.123.1.x

这是最短的版本,适用于IPV4,通过将IP地址转换为长(ip2long()),屏蔽底部的8位(& (~255)),将其转换回IP字符串,始终以0结尾。所以删除它并用x替换它。

echo maskLastSegment("128.123.1.1").PHP_EOL; // 128.123.1.x
echo maskLastSegment("2001:0db8:85a3:0000:0000:8a2e:0370:7334").PHP_EOL; // 2001:db8:85a3::8a2e:370:x

function maskLastSegment ( $ip )    {
    $ipaddr =  inet_pton($ip);
    if ( strlen($ipaddr) == 4 ) {
        $ipaddr[3] = chr(0);
    }
    else    {
        $ipaddr[14] = chr(0);
        $ipaddr[15] = chr(0);
    }

    return rtrim(inet_ntop($ipaddr),"0")."x";
}

此版本适用于两种类型的IP地址,使用inet_pton()将地址转换为打包号码,然后根据地址类型将最后一位数字替换为0(对于IPV6,这实际上是两个字节)。然后它与第一个选项相同,将其转换回字符串并删除最后一个0并添加x

(额外的一个)只需将IPV4地址视为字符串,然后将其“爆炸”。并重建除了最后一个......

$ip = "128.123.1.2";
list($s1,$s2,$s3,$s4) = explode(".", $ip);
echo $s1.".".$s2.".".$s3.".x"; // 128.123.1.x

答案 1 :(得分:0)

我假设您将要转换的内容和数组a.b.c.d转换为a.b.c.x

您可以转换为数组,拼接然后内爆。

$new_ip = implode('.', array_slice(explode('.', $ip), 0, 3)) . '.x';