Kir*_*met 8 php string performance
任何人都知道一种有效而安全的方法来查看这个输入:
$_SERVER['REMOTE_ADDR']
Run Code Online (Sandbox Code Playgroud)
匹配类似于这个不一致过滤器数组的东西(请注意200.100.*.*可以表示为200.100.*),并用*表示通配符:
array(
'192.168.1.*',
'192.168.2.1*',
'10.0.0.*',
'200.100.*.*',
'300.200.*',
)
Run Code Online (Sandbox Code Playgroud)
更新
思考?
foreach($instanceSettings['accessControl']['allowedIpV4Addresses'] as $ipV4Address) {
echo 'Now checking against '.$ipV4Address.'.';
// Compare each octet
$ipV4AddressOctets = String::explode('.', $ipV4Address);
$remoteIpV4AddressOctets = String::explode('.', $_SERVER['REMOTE_ADDR']);
$remoteIpV4AddressIsAllowed = true;
for($i = 0; $i < Arr::size($ipV4AddressOctets); $i++) {
echo 'Comparing '.$ipV4AddressOctets[$i].' against '.$remoteIpV4AddressOctets[$i].'.';
if($ipV4AddressOctets[$i] != $remoteIpV4AddressOctets[$i] && $ipV4AddressOctets[$i] != '*') {
echo 'No match.';
$remoteIpV4AddressIsAllowed = false;
break;
}
}
// Get out of the foreach if we've found a match
if($remoteIpV4AddressIsAllowed) {
break;
}
}
Run Code Online (Sandbox Code Playgroud)
我没有标记这一点,但我会选择使用网络硬件/软件使用的方法...
将任何*替换为0和255.将IP转换为整数
所以如果255.255.255.*变成255.255.255.0和255.255.255.255然后在这两个ips上执行ip2long函数.
然后你可以将给定的ip转换为long ip.例如255.255.50.51进入长ip.
然后你可以比较这个给定ip的长ip是否在黑名单中转换后的长ips之间.如果是,那么它是不允许的.
$ips = array("ip1", "ip2");
foreach($ips as $ip){
$ip1 = str_replace("*", "0", $ip);
$ip2 = str_replace("*", "255", $ip);
$ip1 = ip2long($ip1);
$ip2 = ip2long($ip2);
$givenip = $_GET["ip"];
$givenip = ip2long($givenip);
if($givenip >= $ip1 && $ip <= $givenip){
echo "blacklist ip hit between {$ip1} and {$ip2} on {$ip}";
}
}
Run Code Online (Sandbox Code Playgroud)
删除星号,然后执行以下操作:
$ips = array('192.168.1.', '10.0.0.');
foreach ($ips as $ip) {
if (strpos($_SERVER['REMOTE_ADDR'], $ip) === 0) {
// match
}
}
Run Code Online (Sandbox Code Playgroud)
为什么不直接使用正则表达式呢?
preg_match("((192\\.168\\.1)|(10\\.0\\.0)|(127\\.0\\.0)\\.[012]\\d{0,2}|(\\:\\:1))",$_SERVER['REMOTE_ADDR'])
Run Code Online (Sandbox Code Playgroud)