Фильтрация IP-адресов PHP
Я хочу разрешить пользователям фильтровать свой логин на основе их 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, разнесенный на точке)
есть ли более быстрый способ сделать это?
спасибо
Ответы
Ответ 1
<?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 (no wild card), вы можете использовать:
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'));
Ответ 2
Может быть, эта идея поможет вам:
<?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);
;
Ответ 3
$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;
}