Бан ip и его подсети в Битрикс

Если нужно забанить не только конкретное IP но и его подсеть, пишем ниже приведенный код, данные айпи и подсети в примере хранятся в Highloadblock. Код прописываем самым первым в  init.php, для удобства код можно поместить в класс, или подключать через include.
logo
logo
PHP
<?
   use Bitrix\Highloadblock as HL;
   use Bitrix\Main\Entity;

   CModule::IncludeModule("highloadblock");
   $ip_visitor = realIpVisitor();
   $hblock_id = 3;
  
   $hlblock = HL\HighloadBlockTable::getById($hblock_id)->fetch();
   $entity = HL\HighloadBlockTable::compileEntity($hlblock);
   $entity_data_class = $entity->getDataClass();
   $rsData = $entity_data_class::getList(array(
     "select" => array("*"),
     "order" => array("ID" => "ASC")
   ));
 
   while($arData = $rsData->Fetch())
   {
      $ip = trim($arData["UF_IP"]);
      $prefix = trim($arData["UF_PREFIX"]);

      if(empty($prefix))  //Бан конкретного айпи, если не указана подсеть
      {
         if($ip_visitor == $ip)
         {
            http_response_code(403);
            die("403 Forbidden");
         }
      }
      else //Бан айпи и его подсети
      {
          $network = ip2long($ip);  
          $ip = ip2long($ip_visitor);
          $n1 = $network >> (32 - $prefix);
          $n2 = $ip >> (32 - $prefix);

          if($n1 == $n2) 
          {
             http_response_code(403);
             die("403 Forbidden");
          }
      }
   }


//Определяем реальное айпи посетителя
function realIpVisitor()
{
   $ip = $_SERVER['REMOTE_ADDR'];
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
        foreach ($matches[0] AS $xip) {
            if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {
                $ip = $xip;
                break;
            }
        }
    } elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (isset($_SERVER['HTTP_CF_CONNECTING_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CF_CONNECTING_IP'])) {
        $ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
    } elseif (isset($_SERVER['HTTP_X_REAL_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_REAL_IP'])) {
        $ip = $_SERVER['HTTP_X_REAL_IP'];
    }
    return $ip;
}

Спасибо! Заявка успешно отправлена, мы с Вами свяжемся в ближайшее время!