我想允许用户根据其IP地址(我将实现的用户首选项中的新设置)过滤登录信息。
因此,如果具有特定ip登录名的用户没有限制,则登录成功。
在任何其他情况下,我都在想
如果用户选择自己的完整IP(例如67.31.85.47)并且拥有该IP,则登录很好
如果用户选择67.31.85。*并具有此IP,则登录很好
如果用户选择67.31 ..并具有此IP,则登录很好
如果用户选择67 ... *并具有此IP,则登录正常
其他情况无效
用户最多可以选择5个IP限制。例如:
67.31.*.*
167.77.47.*
62.11.28.28
25.57.*.*
169.*.*.*
我打算使用爆炸剥离IP,然后将其与他设置的所有限制进行比较。
这可能很慢,因为我必须检查5次* 4(4 = IP在点上爆炸)
有没有更快的方法呢?
谢谢
最佳答案
<?php
function testIP($ip) {
if($ip == '*' || $ip == '*.*.*.*') {
return TRUE;
}
if($_SERVER['REMOTE_ADDR'] == $ip) {
return TRUE;
}
$mask = str_replace('.*', '', $ip);
return strpos($_SERVER['REMOTE_ADDR'], $mask) === 0;
}
$_SERVER['REMOTE_ADDR'] = '70.69.68.67';
$ip = '1.11.1.*';
echo "Is $ip good: "; var_dump(testIP($ip));
$ip = '2.34.9.1';
echo "Is $ip good: "; var_dump(testIP($ip));
$ip = '70.11.*.*';
echo "Is $ip good: "; var_dump(testIP($ip));
$ip = '70.69.68.*';
echo "Is $ip good: "; var_dump(testIP($ip));
$ip = '70.69.*.*';
echo "Is $ip good: "; var_dump(testIP($ip));
$ip = '70.*.*.*';
echo "Is $ip good: "; var_dump(testIP($ip));
$ip = '*.*.*.*';
echo "Is $ip good: "; var_dump(testIP($ip));
$ip = '*';
echo "Is $ip good: "; var_dump(testIP($ip));
将输出:
Is 1.11.1.* good: bool(false)
Is 2.34.9.1 good: bool(false)
Is 70.11.*.* good: bool(false)
Is 70.69.68.* good: bool(true)
Is 70.69.*.* good: bool(true)
Is 70.*.*.* good: bool(true)
Is *.*.*.* good: bool(true)
Is * good: bool(true)
如果您要查找特定的ip(无通配符)检查,则可以使用:
function is_private_ip($ip) {
return filter_var($ip, FILTER_VALIDATE_IP) != FALSE;
}
var_dump(is_private_ip('82 .237.3.3'));
var_dump(is_private_ip('748.1234.5.4'));
关于php - PHP IP过滤,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8071395/