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

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

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

  1. function getIp($default = '')
  2. {
  3. if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
  4. $value = $_SERVER['HTTP_CLIENT_IP'];
  5. } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  6. $value = $_SERVER['HTTP_X_FORWARDED_FOR'];
  7. } elseif (!empty($_SERVER['REMOTE_ADDR'])) {
  8. $value = $_SERVER['REMOTE_ADDR'];
  9. } else {
  10. return $default;
  11. }
  12.  
  13. return $value;
  14. }

Фильтрация по списку
  1. $black_list = array(
  2. '192.168.0.0',
  3. '192.168.255.255',
  4. '172.16.0.0',
  5. '172.31.255.255',
  6. );
  7.  
  8. if (in_array($_SERVER['REMOTE_ADDR'], $black_list)) {
  9. }

В .htaccess применяется конструкция Order, Allow, Deny. Адреса перечисляются через пробел или отдельными строками.
  1. Order Allow,Deny
  2. Allow from all
  3. Deny from 192.168.0.0 192.168.255.255 172.16.0.0 172.31.255.255

  1. Order Allow,Deny
  2. Allow from all
  3. Deny from 192.168.0.0
  4. Deny from 192.168.255.255
  5. Deny from 172.16.0.0
  6. Deny from 172.31.255.255

Фильтрация по диапазону
  1. $black_list = array(
  2. array('192.168.0.0', '192.168.255.255'),
  3. array('172.16.0.0', '172.31.255.255'),
  4. );
  5.  
  6. $ip = @ip2long($_SERVER['REMOTE_ADDR']);
  7. foreach($black_list as $ips) {
  8. if ($ip >= @ip2long($ips[0]) && $ip <= @ip2long($ips[1])) {
  9. }
  10. }

В htaccess диапазон блокируемых IP задаётся в виде бесклассовой адресации (CIDR). Для его формирования можно использовать сервис ip2cidr.com
  1. Order Allow,Deny
  2. Allow from all
  3. Deny from 192.168.0.0/16
  4. Deny from 172.16.0.0/12

Фильтрация по маске
  1. $black_list = array(
  2. '192.168.0.*',
  3. '172.16.*.*'
  4. );
  5.  
  6. foreach($black_list as $ips) {
  7. if (preg_match('/' . $ips . '/', $_SERVER['REMOTE_ADDR'])) {
  8. exit()
  9. }
  10. }

В .htaccess нельзя задать маску вида 192.168.0.*, но можно не указывать последние части адреса – будет заблокирован весь диапазон.
  1. Order Allow,Deny
  2. Allow from all
  3. Deny from 192.168.
  4. Deny from 172.16.


  08.06.24 / 16:59 | htaccess |   151 | 2   0