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