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

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

1

В 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;
}
PHP
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;
}
PHP

В .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
htaccess
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
htaccess
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;
	}
}
PHP

В 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
htaccess
4
$black_list = array(
	'192.168.0.*',  
	'172.16.*.*'
);

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

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

Order Allow,Deny
Allow from all
Deny from 192.168.
Deny from 172.16.
htaccess
24.10.2018, обновлено 26.11.2019
15474
Следующая запись Массив $_SERVER

Комментарии 1

Принтстиж ИНК Принтстиж ИНК
23 февраля 2024 в 14:54
Подскажите, пожалуйста, как видоизменить код в примере 3 таким образом, чтобы было ELSE? То есть, нужно чтобы скрипт отрабатывал так, чтобы можно было выводить один код для IP из диапазона и другой код для IP, которого нет в диапазонах.

, чтобы добавить комментарий.

Другие публикации

Автоматическое сжатие и оптимизация картинок на сайте
Изображения нужно сжимать для ускорения скорости загрузки сайта, но как это сделать? На многих хостингах нет...
31445
+7
Работа с директориями в PHP
Набор PHP функций для работы с директориями, получение списка файлов в папке, копирование и удаление содержимого папок.
33113
-1
HTTP коды
Список основных кодов состояния HTTP, без WebDAV.
12725
+1
Календарь на PHP
PHP-класс для вывода календаря на месяц, год или любой другой интервал с возможностью выделить отдельные даты и вывести к ним подсказки.
36158
+13
Получить фото из Instagram без API
Так как Instagram и Fasebook ограничили доступ к API, а фото с открытого аккаунта всё же нужно периодически получать и...
25796
+7
Whois, как получить данные IP-адреса и домена в PHP
Несколько примеров как в PHP получить информацию о домене и IP-адресе.
21414
+6