Фильтрация IP-адресов PHP


Я хочу разрешить пользователям фильтровать свой логин на основе их 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-адрес с помощью explode, а затем сравнил его со всеми установленными им ограничениями. это может быть медленным, так как мне нужно проверить 5 раз *4 (4 = IP-адрес взорван в точке)

Есть ли более быстрый способ сделать это? спасибо

Author: eric, 2011-11-10

3 answers

<?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;
}

Переменная Dump(is_private_ip('82.237.3.3')); параметр var_dump(is_private_ip)('748.1234.5.4'));

 26
Author: Book Of Zeus, 2011-11-18 18:35:44

Может быть, эта идея поможет вам:

<?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);

;

 5
Author: Anton P Robul, 2011-11-09 21:02:11
$auth_ip=array();
$client_ip=array();
$client_ip=explode(".", $_SERVER['REMOTE_ADDR']);
$auth_ip=explode("\n", $patner_name_id[0]['client_ip']);
$j=0;
$flag=0;

foreach ($auth_ip as $value) {
    $i=0;
    $value=explode(".", $value);
    foreach ($value as $valueip) {
        if($valueip!="*") { 
            if($valueip!=$client_ip[$i]){
                $flag=1;
                 break;
            }
            $i++;
        }
        else {
            $i++;
            continue;
        }               
    }
}

if($flag==1){
    header("Location:".$default_company);           
    exit;
}
 0
Author: Bharat Parmar, 2016-01-22 10:57:19