PHP

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

Примеры как запретить доступ к сайту по IP-адресам в PHP и htaccess.

1

Определение IP-адреса

В PHP IP-адрес клиента доступен в переменной $_SERVER['REMOTE_ADDR'], но не всегда она содержит истинный т.к. клиент может использовать прокси. Для определение истинного адреса можно использовать функцию.

function getIp($default = '')
{
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
        $value = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $value = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } elseif (!empty($_SERVER['REMOTE_ADDR'])) {
        $value = $_SERVER['REMOTE_ADDR'];
    } else {
        return $default;
    }

    return $value;
}
2

Фильтрация по списку

$black_list = array(
    '192.168.0.0', 
    '192.168.255.255',
    '172.16.0.0', 
    '172.31.255.255',  
);

if (in_array($_SERVER['REMOTE_ADDR'], $black_list)) {
    exit;
}

В .htaccess применяется конструкция Order, Allow, Deny. Адреса перечисляются через пробел или отдельными строками.

Order Allow,Deny
Allow from all
Deny from 192.168.0.0 192.168.255.255 172.16.0.0 172.31.255.255
Order Allow,Deny
Allow from all
Deny from 192.168.0.0
Deny from 192.168.255.255
Deny from 172.16.0.0
Deny from 172.31.255.255
3

Фильтрация по диапазону

$black_list = array(
    array('192.168.0.0', '192.168.255.255'),  
    array('172.16.0.0', '172.31.255.255'),  
);

$ip = @ip2long($_SERVER['REMOTE_ADDR']);
foreach($black_list as $ips) {
    if ($ip >= @ip2long($ips[0]) && $ip <= @ip2long($ips[1])) {
        exit;
    }
}

В .htaccess диапазон блокируемых IP задаётся в виде бесклассовой адресации (CIDR).  Для его формирования можно использовать сервис ip2cidr.com

Order Allow,Deny
Allow from all
Deny from 192.168.0.0/16
Deny from 172.16.0.0/12
4

Фильтрация по маске

$black_list = array(
    '192.168.0.*',  
    '172.16.*.*'
);

foreach($black_list as $ips) {
    if (preg_match('/' . $ips . '/', $_SERVER['REMOTE_ADDR'])) {
        exit()
    }
}

В .htaccess нельзя задать маску вида 192.168.0.*, но можно не указывать последние части адреса - будет заблокирован весь диапазон.

Order Allow,Deny
Allow from all
Deny from 192.168.
Deny from 172.16.
24 октября 2018
В последнее время письма отправляемые с хостингов через функции mail() и mb_send_mail() часто попадают или совсем не...
cURL PHP – это библиотека предназначенная для получения и передачи данных через такие протоколы, как HTTP, FTP, HTTPS....
В статье приведены основные примеры работы с расширением PHP PDO. Такие как подключение к БД, получение, изменение и...
Библиотека GD дает возможность работать с изображениями в PHP. Далее представлены примеры как изменить размер, вырезать...