PHP IP 过滤

标签 php ip filtering

我想允许用户根据他们的 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.*.*.*

我想用 explode 剥离 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 IP 过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8071395/

相关文章:

php - 循环修改数组

php - Laravel artisan 优化不创建引导/编译

php - 请求库 : Failed to establish a new connection: [Errno 13] Permission denied

apache - 方括号中的 IPv4 地址点

c - C中输入的IP地址

matlab - 滤波后低频移位

matlab - 带汉宁窗的傅立叶滤波后信号恢复

php - 只写一行到我的 SQL 数据库

mysql - 检查IP是否在子网中

python - 迭代定义的 Numpy 数组创建