PHP IP过滤

eri*_*ric 19 php ip filtering

我想允许用户根据他们的IP地址过滤他们的登录(我将实现的用户偏好中的新设置).

因此,如果具有特定IP登录且没有限制的用户,则登录成功.

在任何其他情况下,我在想这个

如果用户选择他的完整IP,如67.31.85.47并且他有这个IP,那么如果用户选择67.31.85.*并且拥有此IP则登录是好的,那么如果用户选择67.31则登录是好的..如果用户选择67,则拥有此IP然后登录是好的..*并拥有此IP然后登录是好的任何其他情况它是无效的

用户最多可以选择5个IP限制.例如:

67.31.*.*
167.77.47.*
62.11.28.28
25.57.*.*
169.*.*.*
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用爆炸来剥离IP,然后与他设置的所有限制进行比较.这可能很慢,因为我必须检查5次*4(4 = IP在点上爆炸)

有更快的方法吗?谢谢

Boo*_*eus 27

<?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));
Run Code Online (Sandbox Code Playgroud)

将输出:

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)
Run Code Online (Sandbox Code Playgroud)

如果您正在寻找特定的IP(无外卡)检查,您可以使用:

function is_private_ip($ip) {
  return filter_var($ip, FILTER_VALIDATE_IP) != FALSE;
}
Run Code Online (Sandbox Code Playgroud)

的var_dump(is_private_ip('82 .237.3.3' )); 的var_dump(is_private_ip( '748.1234.5.4'));


小智 6

也许这个想法对你有帮助:

<?php
$ip_restrict = "67.31.*.*
167.77.47.*
62.11.28.28
25.57.*.*
169.*.*.*";

$ip_restrict = array_flip(explode("\n", $ip_restrict));
$ip = preg_match("!([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)!", $_SERVER['REMOTE_ADDR'], $ip_match);


$ip_in_blacklist = false;
$ip_check_1 = $ip_match[1] . '.*.*.*';
$ip_check_2 = $ip_match[1] . '.' . $ip_match[2] . '.*.*';
$ip_check_3 = $ip_match[1] . '.' . $ip_match[2] . '.' . $ip_match[3] . '.*';
$ip_check_4 = $ip_match[1] . '.' . $ip_match[2] . '.' . $ip_match[3] . '.' . $ip_match[4];

if (isset($ip_restrict[$ip_check_1]) || isset($ip_restrict[$ip_check_2]) || isset($ip_restrict[$ip_check_3]) || isset($ip_restrict[$ip_check_4])) {
    $ip_in_blacklist = true;
}

var_dump($ip_in_blacklist);
Run Code Online (Sandbox Code Playgroud)

;

  • 为什么使用preg_match?为什么不爆炸?有什么不同? (4认同)
  • explode不使用regexp vs preg_match (2认同)