Примеры как запретить доступ к сайту по IP-адресам в PHP и htaccess.
В 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;
}
$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
$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
$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.*
, но можно не указывать последние части адреса – будет заблокирован весь диапазон.