如果两个IPv6地址相等,如何签入PHP?
我想检查IP是否被列入白名单,但IPv6地址可以有不同的表示形式: 例如,2001:0DB8:0:0:1::1是2001:0DB8:0000:0000:0001:0000:0001的缩写形式 因此,字符串比较不起作用。我怎么知道两个地址相等?使用 但是,只有在PHP未使用-disable-ipv6选项编译时,这才有效。您可以使用if来检查这一点!已禁用定义的“AF_INET6”回显IPv6支持 使用 但是,只有在PHP未使用-disable-ipv6选项编译时,这才有效。您可以使用if来检查这一点!已禁用定义的“AF_INET6”回显IPv6支持 inet\u pton没有去掉带括号的IPv6地址中的括号,这只与非常特定的用例有关:inet\u pton[::1]返回FALSE。这是因为括号内的地址在技术上不是有效的IPv6地址。相反,括号内的地址包含IPv6地址,即使IPv6位于URL中时需要括号 以下是Ipv6唯一的功能:如果两个IPv6地址相等,如何签入PHP?,php,ipv6,Php,Ipv6,我想检查IP是否被列入白名单,但IPv6地址可以有不同的表示形式: 例如,2001:0DB8:0:0:1::1是2001:0DB8:0000:0000:0001:0000:0001的缩写形式 因此,字符串比较不起作用。我怎么知道两个地址相等?使用 但是,只有在PHP未使用-disable-ipv6选项编译时,这才有效。您可以使用if来检查这一点!已禁用定义的“AF_INET6”回显IPv6支持 使用 但是,只有在PHP未使用-disable-ipv6选项编译时,这才有效。您可以使用if来检查这一
$bothBracketsArray = array('[', ']');
function are_ipv6_equal($a, $b) {
global $bothBracketsArray;
return inet_pton(str_replace($bothBracketsArray, '', $a)) === inet_pton(str_replace($bothBracketsArray, '', $b));
}
$bothBracketsArray是一个全局数组,因此PHP不必每次都分配一个新数组,也不必对其模板进行浅层克隆,也不必像PHP现在所做的那样
我自己的目的还需要比较端口号和处理IPv4,因为我正在监视netstat的输出,以查看哪个进程PID位于套接字的另一侧
$bothBracketsArray = array('[', ']');
function doIpsAndPortsEqual($a, $b) {
global $bothBracketsArray;
$lastPosA = strrpos($a, ":"); // port #
$lastPosB = strrpos($b, ":"); // port #
if (substr($a, $lastPosA+1) !== substr($b, $lastPosB+1)) return false;
$ipA = substr($a, 0, $lastPosA);
$ipB = substr($a, 0, $lastPosB);
if (strpos($ipA, ':') !== false) { // Ipv6
return inet_pton(str_replace($bothBracketsArray, '', $ipA)) === inet_pton(str_replace($bothBracketsArray, '', $ipB));
} else { // Ipv4
return $ipA === $ipB;
}
}
inet_pton没有去掉括号中的IPv6地址中的括号,这只对非常特定的用例有影响:inet_pton[::1]返回FALSE。这是因为括号内的地址在技术上不是有效的IPv6地址。相反,括号内的地址包含IPv6地址,即使IPv6位于URL中时需要括号
以下是Ipv6唯一的功能:
$bothBracketsArray = array('[', ']');
function are_ipv6_equal($a, $b) {
global $bothBracketsArray;
return inet_pton(str_replace($bothBracketsArray, '', $a)) === inet_pton(str_replace($bothBracketsArray, '', $b));
}
$bothBracketsArray是一个全局数组,因此PHP不必每次都分配一个新数组,也不必对其模板进行浅层克隆,也不必像PHP现在所做的那样
我自己的目的还需要比较端口号和处理IPv4,因为我正在监视netstat的输出,以查看哪个进程PID位于套接字的另一侧
$bothBracketsArray = array('[', ']');
function doIpsAndPortsEqual($a, $b) {
global $bothBracketsArray;
$lastPosA = strrpos($a, ":"); // port #
$lastPosB = strrpos($b, ":"); // port #
if (substr($a, $lastPosA+1) !== substr($b, $lastPosB+1)) return false;
$ipA = substr($a, 0, $lastPosA);
$ipB = substr($a, 0, $lastPosB);
if (strpos($ipA, ':') !== false) { // Ipv6
return inet_pton(str_replace($bothBracketsArray, '', $ipA)) === inet_pton(str_replace($bothBracketsArray, '', $ipB));
} else { // Ipv4
return $ipA === $ipB;
}
}