В этой статье мы расскажем, как интегрировать брандмауэр веб-приложений (WAF) в веб-приложение на базе PHP с использованием фреймворка Slim 3. К концу статьи вы поймете, как настроить собственный WAF для повышения устойчивости вашего приложения к атакам и управления распространенными угрозами безопасности.

1. Введение 

Брандмауэр веб-приложений — это важнейший рубеж обороны для современных веб-приложений. В этом туториале мы создадим безопасное PHP-приложение с нуля с использованием Slim 3 и интегрируем в него Shieldon WAF для защиты.

 Чему вы научитесь:

  • Настройке базового PHP-приложения на Slim 3.
  • Интеграции и подключению middleware Shieldon WAF.
  • Доступу к панели управления Shieldon и ее настройке.
  • Настройке активной защиты (демон, CAPTCHA, rate limiting, XSS и управление IP-адресами).
  • Подготовке к продакшену и обработке ложных срабатываний.

 Предварительные требования:

2. Основы WAF 

Брандмауэр веб-приложений (WAF) — это протокол, который работает на уровне прикладного уровня модели взаимодействия открытых систем (OSI). Он выступает в качестве защитного барьера между запросами протокола передачи гипертекста (HTTP) и интернетом. Он защищает веб-приложения от различных интернет-атак, таких как SQL-инъекции, отравление файлов cookie, межсайтовый скриптинг (XSS) и межсайтовая подделка запросов. WAF представляет собой протокол обратного прокси-сервера, что означает, что он действует как щит для сервера, защищая его от прямого доступа: запрос сначала проходит через WAF и только потом достигает сервера. Этим он отличается от обычного прокси-сервера, который скрывает личность клиента через посредника.

rDhlOyyKBnUKR5lFeW5uwJGVzWYWydeXH1yzghWJ.webp

WAF работает на основе политик, которые нацелены на защиту от уязвимостей путем мониторинга трафика и фильтрации вредоносных запросов. Это функционирует на основе двух моделей:

  1. Белый список (Allow List) — разрешает или допускает запросы, одобренные заданными в WAF политиками. Например, если устройство с IP-адресом 192.168.0.25 добавлено в белый список, все запросы с этого устройства будут приняты.
  2. Черный список (Block List) — запрещает доступ к серверу для запросов, которые не соответствуют политикам, заданным в WAF. Например, если устройство с IP-адресом 192.168.0.30 добавлено в черный список, все запросы с этого устройства будут отклонены.

Типы WAF 

  1. Хост-базированный WAF (Host-based WAF) — интегрируется в программное обеспечение приложения. Он недорог и прост в настройке. Однако он потребляет много системных ресурсов, сложен в реализации и требует высоких затрат на обслуживание.
  2. Сетевой WAF (Network-based) — обычно встраивается в аппаратное обеспечение системы. В основном устанавливается для минимизации задержек. Тем не менее, он очень дорог в установке, требует физического пространства для хранения и обслуживания оборудования.
  3. Облачный WAF (Cloud based) — самый простой в реализации и обслуживании. Его также очень легко развернуть без дополнительных затрат. Однако он зависит от стороннего провайдера, поэтому некоторые функции могут быть закрыты (black boxed) поставщиком. Это обуславливает необходимость убедиться, что провайдер обладает достаточными возможностями кастомизации под ваши нужды.

3. Создание каркаса приложения Slim 

В этом разделе мы рассмотрим шаги по установке Shieldon — брандмауэра веб-приложений на базе PHP, используемого для обнаружения и блокировки подозрительной активности, часто с использованием CAPTCHA для верификации.

Мы будем использовать  Slim  в качестве нашей PHP-библиотеки.

Требования 

  1. Установленный PHP — пожалуйста, обратитесь к этой странице за руководствами по установке.
  2. Composer — см. руководство по установке.
  3. Приложение базы данных, например MySQL.

Установка 

Настройка проекта 

Установите приложение Slim с помощью следующих команд в терминале:

 mkdir WAF-Project
 

Это создает папку для нашего проекта.

 cd WAF-Project
 

Приведенная выше команда осуществляет переход в корневую папку проекта.
  WAF-Project  в данном случае — это название нашего проекта.

 composer init
 

Команда предлагает выбрать конфигурацию для проекта. Просто нажимайте Enter для применения настроек по умолчанию, пока не завершатся все запросы. Она инициализирует composer в корне проекта и создает файл  composer.json .

 composer require slim/slim
 

Эта команда устанавливает Slim в папку проекта и добавляет его в composer.json.

Затем откройте проект в своем редакторе.
 Создайте папку  public  в корневой директории и внутри нее создайте файл index.php. Вставьте следующий код:

 <?php
require __DIR__ . '/../vendor/autoload.php';

$app = new \Slim\App();

$app->get('/', function ($request, $response, $args) {
    return $response->write("Hello, Slim 3!");
});

$app->run();
 

Затем выполните следующую команду в терминале:

 php -S localhost:8080 -t public
 

Перейдите по адресу http://localhost:8080/. Вы должны увидеть  Hello, Slim 3! , что означает завершение настройки нашего проекта.

4. Установка и подключение Middleware 

Установка Shieldon 

В терминале выполните следующую команду:

 composer require shieldon/shieldon "^2" 
 

Это установит вторую версию Shieldon.

 composer install slim/csrf "^0.8"
 

Создайте доступную для записи папку внутри папки cache.

 mkdir -p cache/shieldon_firewall
chmod 0777 cache/shieldon_firewall
 

Отсюда будут выполняться все файлы Shieldon.

На новой вкладке терминала откройте MySQL:

 mysql -u root -p
 

Введите свой пароль, затем создайте пустую базу данных:

 create database shieldon_db;
 

Эту базу данных Shieldon будет использовать для хранения всех конфигураций, связанных с поведением пользователей, сеансами и настройками. Мы используем ее позже в этом туториале.

Подключение Middleware приложения 

Создайте новый файл  middleware.php  внутри папки  src . Скопируйте и вставьте следующий код:

 <?php

use Slim\App;
use Slim\Csrf\Guard;

return function (App $app) {
    // Shieldon Firewall middleware
    $app->add(new \Shieldon\Firewall\Integration\Slim3());

    // CSRF middleware
    $container = $app->getContainer();

    $guard = new Guard();
     // Makes tokens persistent across requests
    $guard->setPersistentTokenMode(true);

    // Configure failure handler
    $guard->setFailureCallable(function ($request, $response, $next) {
        $request = $request->withAttribute("csrf_status", false);
        return $next($request, $response);
    });

    $app->add($guard);

    // Add CSRF to container
    $container['csrf'] = function () use ($guard) {
        return $guard;
    };
};
 

Объяснение 

 use Slim\App;  — подключает класс приложения Slim для подсказок типов (type hinting).

  use Slim\Csrf\Guard;  — подключает класс Slim-Csrf. Он защищает формы и маршруты приложения от атак типа «межсайтовая подделка запроса» (CSRF).

  $app->add(new \Shieldon\Firewall\Integration\Slim3());  — находится на самом верхнем уровне, перед логикой приложения. Любой запрос к любым маршрутам проходит через него для проверки на наличие таких атак, как XSS, SQLi, и ботов.

  $container  — хранит контейнер зависимостей Slim, который может содержать такие сервисы, как csrf, db и логгер.

      // Configure failure handler
    $guard->setFailureCallable(function ($request, $response, $next) {
        $request = $request->withAttribute("csrf_status", false);
        return $next($request, $response);
    });

 

Это определяет, что произойдет в случае сбоя валидации токена.
  $request->withAttribute("csrf_status", false)  — добавляет атрибут запроса  csrf_status  со значением false.

  return $next($request, $response);  — продолжает цепочку middleware, а не прерывает ее полностью.

 $app->add($guard);  — регистрирует Csrf Guard в качестве middleware для всех запросов.

Примечание:

 Порядок middleware важен, поскольку:
  1. Shieldon сначала проводит фильтрацию безопасности.
  2. Csrf Guard запускается вторым для защиты от CSRF-атак.

Обновление  public/index.php  

public/index.php 

В  public/index.php  скопируйте и вставьте следующий код:

 <?php
// Error reporting configuration
error_reporting(E_ALL & ~E_DEPRECATED);
ini_set('display_errors', 1);

// Start the session
session_start();

// Ensure clean output buffer
if (ob_get_level()) ob_end_clean();

require __DIR__ . '/../vendor/autoload.php';

use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;

// Create container
$container = new \Slim\Container([
    'settings' => [
        'displayErrorDetails' => true,
        'outputBuffering' => false
    ]
]);

$app = new \Slim\App($container);

// Load middleware (Shieldon + CSRF)
(require __DIR__ . '/../src/middleware.php')($app);


// Home route

$app->get('/', function (Request $request, Response $response, $args) {
    return $response->getBody()->write("Hello, Slim 3!");
});


//Shieldon Firewall Control Panel

$app->map(['GET', 'POST'], '/firewall/panel[/{params:.*}]', function (Request $request, Response $response, array $args) use ($app) {

    $firewall = new \Shieldon\Firewall\Firewall($request);

    $firewall->configure(__DIR__ . '/../cache/shieldon_firewall');
    $firewall->controlPanel('/firewall/panel/');

    $panel = new \Shieldon\Firewall\Panel();

    // CSRF from middleware
    $csrf = $app->getContainer()->get('csrf');
    $nameKey = $csrf->getTokenNameKey();
    $valueKey = $csrf->getTokenValueKey();

    $csrfName  = $request->getAttribute($nameKey);
    $csrfValue = $request->getAttribute($valueKey);

    $panel->csrf(
        [$nameKey => $csrfName],
        [$valueKey => $csrfValue]
    );

    $panel->entry();

    return $response;
});
$app->run();
 

Объяснение 

 error_reporting(E_ALL & ~E_DEPRECATED);  — сообщает приложению о необходимости отображать все предупреждения, связанные с устаревшим функционалом (deprecations).

  ini_set('display_errors', 1);  — отображает ошибки PHP прямо в браузере.

  session_start();  — инициализирует PHP-сессии. Они крайне важны для брандмауэра Shieldon и Csrf Guard для сохранения авторизации, CAPTCHA и хранения данных сеанса.

  ob_end_clean();  — очищает буферизацию вывода, если какой-либо запущенный процесс ее использовал.

  require __DIR__ . '/../vendor/autoload.php';  — автоматически загружает все классы из Slim и Shieldon для моего кастомного middleware.

 use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
 

В приведенном выше коде задаются более короткие псевдонимы (алиасы) для интерфейсов сообщений PSR для  ServerRequestInterface  и  ResponseInterface . Slim передает объекты, реализующие эти интерфейсы, в каждый обратный вызов (callback) маршрута.

 $container = new \Slim\Container([
    'settings' => [
        'displayErrorDetails' => true,
        'outputBuffering' => false
    ]
]);
 

Здесь настраивается контейнер Slim.  'displayErrorDetails' => true  указывает Slim отображать все трассировки ошибок, что очень полезно, особенно во время разработки.

  'outputBuffering' => false  устанавливает буферизацию содержимого в значение false, поэтому выведенный с помощью echo контент не перехватывается автоматически.

 $app = new \Slim\App($container);  — создает экземпляр приложения Slim, созданный с помощью указанных выше пользовательских конфигураций.

 (require __DIR__ . '/../src/middleware.php')($app);  — вызывает middleware в директории  src  и немедленно выполняет его, передавая  $app  в качестве аргумента. Вызов этой строки активирует брандмауэр и защиту CSRF глобально. Помните, что Slim 3 был настроен на middleware, которое инспектирует все запросы и отфильтровывает вредоносные до того, как они достигнут маршрутов. Csrf Guard также был настроен в middleware для добавления токенов защиты от CSRF ко всем POST-запросам.

 $app->get('/', function (Request $request, Response $response, $args) {
    return $response->getBody()->write("Hello, Slim 3!");
});
 

Здесь определяется простой домашний маршрут, который выводит  Hello, Slim 3!  в браузере.

 $app->map(['GET', 'POST'], '/firewall/panel[/{params:.*}]', function (Request $request, Response $response, array $args) use ($app) {})
 

Определяет  /firewall/panel , который разрешает методы  GET  и  POST . Он использует шаблон параметров Slim [/params:.*] для обработки других дополнительных сегментов пути. Это особенно полезно, поскольку Shieldon использует такие маршруты, как  /firewall/panel/security/authentication  и  /firewall/panel/settings/basic/ .

 $firewall = new \Shieldon\Firewall\Firewall($request);  — создает экземпляр брандмауэра, привязанный к текущему запросу PSR-7. Брандмауэр перехватывает запросы, применяя такие правила, как ограничения по IP, rate limiting и проверки CAPTCHA.

 $firewall->configure(__DIR__ . '/../cache/shieldon_firewall');  — задает место хранения данных Shieldon. Директория должна быть доступна для записи PHP.

 $firewall->controlPanel('/firewall/panel/');  — указывает, откуда панель администратора доступна в приложении.

 $panel = new \Shieldon\Firewall\Panel();  — инициализирует компонент пользовательского интерфейса, который рендерит интерфейс панели управления (HTML-шаблоны и виджеты CAPTCHA).

 $csrf = $app->getContainer()->get('csrf');
$nameKey = $csrf->getTokenNameKey();
$valueKey = $csrf->getTokenValueKey();

$csrfName  = $request->getAttribute($nameKey);
$csrfValue = $request->getAttribute($valueKey);

$panel->csrf(
    [$nameKey => $csrfName],
    [$valueKey => $csrfValue]
);
 

В middleware сгенерированные CSRF ключи и значения сеанса сохранялись для обеспечения постоянства (persistence) в сеансе. Теперь они извлекаются и передаются в панель Shieldon с помощью  $panel -> csrf() , чтобы Shieldon включал валидные сгенерированные Slim CSRF-токены в HTML-формы.

 $panel->entry();  рендерит панель управления Shieldon. Она обрабатывает внутреннюю маршрутизацию, такую как  /overview  и  /login .

 $app -> run()  — Slim берет на себя весь жизненный цикл HTTP. Он принимает входящий запрос, пропускает его через все зарегистрированные middleware, сопоставляет с правильным маршрутом, выполняет callback и отправляет окончательный ответ обратно клиенту.

5. Доступ к панели управления Shieldon 

Запустите  php -S localhost:8080 -t public . Откройте новую вкладку браузера и перейдите по адресу http://localhost:8080/firewall/panel. На странице входа используйте  shieldon_user  в качестве  username  и  shieldon_pass  в качестве дефолтного  password .

ZcRVTm8eN5UrCcar8RQoVDV00ccEbvbZU0wNVh5X.webp
Нажмите кнопку входа.

Вы должны получить доступ к панели управления shieldon, как показано на скриншоте ниже:
 

r07QkKtqJiNfSot1DXIGH0CHIQkOIKEFxlZuj4uk.webp

6. Настройка защиты 

Запуск демона 

Демон — это фоновый процесс, который работает в Shieldon для мониторинга активности приложения. Это основной процесс, который отслеживает поведение пользователей в веб-приложении и определяет, когда запускать такие события, как ограничения по IP и проверки CAPTCHA.

Чтобы запустить  daemon :

  1. На панели управления Shieldon нажмите «firewall» на боковой панели.
  2. Нажмите «settings» и выберите «daemon» на правой вкладке.
     dpfgmHZ2HGN0CWKXirMp6cD6kBoCtqPy1qItKOKp.webp
  3. Включите тумблер питания.
  4. В разделе драйвера данных выберите MYSQL.
  5. Заполните необходимые данные:  host :  127.0.0.1 ,  database :  shieldon_db ,  user :  root  и  password :  {yourdbpassword} .
    FuIzqBlXthqoL6psu1ZSsU583k8UbbvGIOIbJLhE.webp
  6. Прокрутите вниз и нажмите «save».
  7. Перезагрузите приложение.
  8. Войдите снова.

Настройка CAPTCHA 

Чтобы настроить CAPTCHA, убедитесь, что в вашей системе установлена  php-gd .
Вы можете проверить это, выполнив следующую команду:

 php -i | grep gd
 

В качестве результата вы должны увидеть  gd . Если ничего не возвращается, выполните следующую команду:

 #Debian distros
sudo apt-get install php-gd

#Arch distros
sudo pacman -S php-gd

 
  1. Для других дистрибутивов Unix см. здесь.
  2. Mac: См. здесь и выберите наиболее подходящий метод.
  3. Руководство для Windows

Шаги 

  1. На панели управления Shieldon нажмите «firewall», перейдите в «settings», а затем на вкладку  CAPTCHA  на панели справа.
  2. Выберите тип CAPTCHA: reCaptcha или Image. В данном случае выберите  Image .
  3. Включите тумблер активации справа от типа Image.
  4. Выберите тип комбинации символов, используемый для изображения.
  5. Введите количество символов для каждого изображения CAPTCHA.

9q2sLU3Bdg4KZ3bVO3WhNPFnfABJHTPEG3wDBCuG.webp

При следующем входе в систему отображается страница входа, включающая проверку CAPTCHA, как показано на скриншоте ниже:
 

n4Gk6ocipl0NKVKYTudCO4ZJpI0atGuKmYSjnGnV.webp

Ограничение частоты запросов (Rate limiting) 

Ограничение частоты запросов (Rate limiting) — это механизм безопасности, который устанавливает лимит на действия пользователя в веб-приложении в течение заданного периода времени. Этими действиями могут быть попытки входа в приложение или обновление страницы. Это мера контроля, которая может применяться к веб-приложениям для ограничения количества запросов, которые один пользователь может сделать к одному эндпоинту за определенный промежуток времени. Это можно использовать для защиты приложения от атак типа «отказ в обслуживании» (Denial-of-Service), которые часто используются для перегрузки сервера большим количеством запросов, делая его недоступным для других пользователей.

Атаки, которые можно остановить с помощью ограничения частоты запросов (rate limiting). 

  1. Атаки методом перебора (Brute Force) Это атаки, которые в основном используют метод проб и ошибок для подбора учетных данных пользователей. Они часто проводятся ботами, нацеленными на страницы входа.
  2. Отказ в обслуживании (Denial of Service) — это кибератака, при которой злоумышленник делает сервис недоступным для обычных пользователей, нарушая нормальную работу устройства. Например, злоумышленник может завалить сервер запросами до тех пор, пока обработка обычного трафика станет невозможной.
  3. Скрапинг данных (Data scraping) — это метод, при котором компьютерная программа извлекает данные из выходных данных, сгенерированных другой программой.

Почему ограничение частоты запросов важно 

  1. Внедрение механизма ограничения частоты запросов необходимо для обеспечения защиты приложений от таких атак, как перебор паролей и отказ в обслуживании. 
  2. Ограничение частоты запросов управляет использованием ресурсов, гарантируя, что сервер не будет перегружен большим количеством запросов, что создает серьезные ограничения с точки зрения производительности и доступности. 
  3. Ограничение частоты запросов уменьшает задержки и повышает скорость отклика сервера, что очень важно для приложений реального времени. Это улучшает пользовательский опыт. 
  4. Ограничение частоты запросов снижает злоупотребление ресурсами сервера. Пользователям ограничивается возможность отправки чрезмерных и ненужных запросов, которые могут существенно повлиять на ресурсы сервера и его производительность.

Чтобы реализовать ограничение частоты запросов в Shieldon, создайте новый файл с именем  /src/rateLimitingMiddleware.php  и вставьте следующий код:

 <?php
class RateLimitMiddleware
{
    private int $maxAttempts;
    private int $timeDecay;


    public function __construct(int $maxAttempts = 3, int $timeDecay = 60)
    {
        $this->maxAttempts = $maxAttempts;
        $this->timeDecay = $timeDecay;
    }


    public function __invoke($request, $response, $next)
    {
        $ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
        $key = 'rate_limit_' . $ip;
        $now = time();

        if (!isset($_SESSION[$key])) {
            $_SESSION[$key] = [
                'count' => 0,
                'reset' => $now + $this->timeDecay,
            ];
        }
        $record = &$_SESSION[$key];

        if ($now > $record['reset']) {
            $record['count'] = 0;
            $record['reset'] = $now + $this->timeDecay;
        }
        $record['count']++;
        if ($record['count'] > $this->maxAttempts) {
            $retryAfter = $record['reset'] - $now;

            $body = sprintf('Too many requests.Please try again after %d seconds.', $retryAfter);

            return $response
                ->withStatus(429)
                ->withHeader('Retry-After', $retryAfter)
                ->write($body);
        }
        return $next($request, $response);
    }
}
 

Затем в  /src/middleware.php  добавьте эту строку после промежуточного ПО (middleware) Shieldon:

     $app->add(new RateLimitMiddleware(5, 60));
 

На панели управления выйдите из системы (log out) и попробуйте непрерывно обновлять страницу шесть раз. Вы достигнете лимита, и страница вернет статус 429 с сообщением  Too many requests.Try again after x seconds .

tPKN3TftWCLq8Yp82FA6lGls5XjjswZgYbzhakDm.webp

 Объяснение

 class RateLimitMiddleware
{....}
 

Это инициализирует повторно используемый класс middleware для Slim. Он будет перехватывать и модифицировать любые запросы до того, как они достигнут контроллеров маршрутов.

 private int $maxAttempts;
private int $timeDecay;
 

 maxAttempt  определяет максимальное количество запросов, которое пользователь может сделать в течение временного окна.

  timeDecay  определяет время ожидания в окне.

 public function __construct(int $maxAttempts = 3, int $timeDecay = 60)
{
    $this->maxAttempts = $maxAttempts;
    $this->timeDecay = $timeDecay;
}
 

Это определение конструктора, которое указывает, что будет передаваться в качестве аргументов в middleware. Определены аргументы  maxAttempts  и  timeDecay .

 public function __invoke($request, $response, $next)
 

Middleware в Slim должны реализовывать  __invoke() , чтобы они могли вести себя как вызываемые функции (callable).

Когда поступает запрос, Slim выполняет:

 $response = $middleware($request,$response,$next)
 

 $request  — объект запроса PSR-7.

  $response  — объект ответа PSR-7.

  $next  — следующее вызываемое middleware, если это разрешено.

 $ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
$key = 'rate_limit_' . $ip;
$now = time();
 

Это получает IP-адрес пользователя, затем создает уникальный ключ сеанса для его сессии. Также фиксируется текущая метка времени Unix (Unix timestamp).

 if (!isset($_SESSION[$key])) {
    $_SESSION[$key] = [
        'count' => 0,
        'reset' => $now + $this->timeDecay,
    ];
}
$record = &$_SESSION[$key];
 

Если это новый пользователь, создается новая запись сеанса.
  $count  хранит количество сделанных на данный момент запросов.  $reset  хранит метку времени сброса лимита.  $record  является ссылкой ( & ), поэтому массивом сеанса можно манипулировать напрямую.

 if ($now > $record['reset']) {
    $record['count'] = 0;
    $record['reset'] = $now + $this->timeDecay;
}
 

Если текущее время превышает установленное время сброса, считается, что лимит запросов истек. Создаются новый счетчик сброса и новое временное окно.

 $record['count']++;
 

Это увеличивает счетчик запросов пользователя в текущем временном окне.

 if ($record['count'] > $this->maxAttempts) {
    $retryAfter = $record['reset'] - $now;

    $body = sprintf('Too many requests. Please try again after %d seconds.', $retryAfter);

    return $response
        ->withStatus(429)
        ->withHeader('Retry-After', $retryAfter)
        ->write($body);
}
 

Если счетчик превышает лимит, вычисляется время до сброса окна, создается сообщение для пользователя о превышении лимита запросов, после чего возвращается код состояния 429.

Защита от межсайтового скриптинга (XSS) 

Это мера безопасности, цель которой — защитить приложение от внедрения злоумышленниками вредоносных скриптов в URL-адреса. Злоумышленники внедряют эти скрипты, сохраняя их в виде переменных, которые выполняются при открытии веб-страницы. Чтобы противостоять этому, необходимо экранировать и очищать переменные (санитизация) — метод, называемый абсолютной устойчивостью к инъекциям. Shieldon предоставляет разработчикам защиту от XSS, которая при включении запрещает выполнение таких скриптов при отрисовке веб-страницы.

Чтобы включить защиту от XSS: 

  1. Откройте панель управления Shieldon. 
  2. Нажмите на пункт Firewall на боковой панели. 
  3. Выберите XSS Protection. 
  4. Переключите тумблер слева для каждого метода, для которого вы хотите включить защиту от XSS. 
  5. Перезапустите приложение.

Что происходит? 

Когда вы включаете защиту от XSS, все переменные методов (GET, POST) и переменные куки (cookie) сканируются. Обнаруживаются распространенные паттерны, используемые в XSS-атаках. Эти паттерны могут включать  <script> ,  <iframe> , обработчики событий вроде  onload=  и  onclick= . Если такие паттерны обнаружены, запрос немедленно блокируется и возвращается статус 403 (Unauthorized). В Shieldon вам потребуется решить капчу (Captcha), после чего вы будете перенаправлены на  / .

Ниже представлен пример снимка экрана с тем, что возвращается при попытке внедрить скрипт в URL.
 В этом руководстве для тестирования использовался  http://localhost:8000/?test=<script>alert('xss')</script> .

0Miffp8sLSG4zIYD0IEb2JJvmaqc4XPW7CLgft7w.webp

Управление IP-адресами 

Это практика безопасности, направленная на разрешение или запрет доступа к веб-сайту по IP-адресу. Shieldon позволяет администраторам приложений блокировать, разрешать или временно ограничивать запросы с определенных IP-адресов прямо из панели управления.

Компоненты менеджера IP-адресов 

1. Белый список (Разрешить / Whitelist) 

Позволяет определенным IP-адресам получать доступ к странице независимо от правил межсетевого экрана. Это позволяет избежать ситуаций, когда доверенные пользователи блокируются автоматическими правилами вроде ограничения частоты запросов и обнаружения XSS — один из способов работы с ложными срабатываниями (false positives), которые неизбежны при использовании правил файрвола. 

2. Черный список (Запретить доступ / Blacklist) 

Предотвращает доступ вредоносных IP-адресов к приложению. Его цель — блокировать известных злоумышленников, подозрительных ботов или пользователей-нарушителей, отправляющих запросы на сервер. Черные списки позволяют сосредоточить ресурсы на известных угрозах, что улучшает управление безопасностью.

Реализация на панели управления Shieldon 

Чтобы включить управление IP-адресами в Shieldon: 

  1. Откройте панель управления. 
  2. Нажмите Firewall на левой панели меню и выберите IP management.
  3. Введите путь, для которого вы хотите включить менеджер IP, справа.
  4. Введите IP-адрес, к которому нужно применить действие.
  5. В выпадающем списке выберите действие: добавить в черный список, в белый список или удалить IP.
  6. Нажмите кнопку отправки (submit). dzywu6aFx7UwaoRBgfbUbhUiKk07mu8rKKi722lF.webp

7. Обработка ложных срабатываний в Shieldon 

Несмотря на высокую эффективность веб-файрвола (WAF), Shieldon может принимать легитимных пользователей за нелегитимных. Встроенные механизмы фильтрации спроектированы строгими, но иногда реальный трафик непреднамеренно активирует их. Shieldon позволяет администратору точечно настроить функции, чтобы минимизировать эти проблемы. 

Причины ложных срабатываний 

  1. Когда легитимный запрос содержит паттерны, напоминающие помеченные как нелегитимные полезные нагрузки (payloads), например ключевые слова SQL в поле формы.
  2. Суперпользователь обновляет страницу или отправляет данные слишком часто, что запускает лимиты запросов.
  3. Автоматизированные скрипты отправляют частые запросы, похожие на ботов.

Ниже приведены способы, которые можно внедрить для обработки ложных срабатываний Shieldon:

1. Использование белого списка (Whitelisting) 

Если определенные пользователи или серверы заслуживают доверия, их IP-адреса можно добавить в белый список, чтобы их никогда не блокировали. Это гарантирует обход большинства ограничений.

2. Проверка CAPTCHA 

Вместо немедленной блокировки запросов подозрительных пользователей можно включить прохождение CAPTCHA: если она решена верно, Shieldon признает их людьми и временно добавляет их сессию в белый список.

3. Использование логов для расследования 

Логи Shieldon можно изучить, чтобы определить, была ли блокировка реальной атакой или ложной тревогой, и принять меры.

8. Повышение безопасности в production (Hardening) и лучшие практики 

Перед развертыванием приложения на «живом» сервере соблюдайте следующие лучшие практики:

  1. Обновите учетные данные: немедленно измените стандартные  shieldon_user  и  shieldon_pass  в панели управления.
  2. Права на директории: ограничьте права на  cache/shieldon_firewall  в production (например,  chmod 0755 ), чтобы предотвратить несанкционированные изменения.
  3. Отключите детали ошибок: измените ' displayErrorDetails' => true  на  false  в контейнере вашего Slim-приложения, чтобы предотвратить утечки трассировки стека (stack trace).
  4. Принудительное использование HTTPS: защитите приложение с помощью SSL-сертификата для защиты CSRF-токенов и переменных активных сессий.

Заключение 

Веб-файрвол (WAF) защищает приложение на уровне прикладного слоя и разработан для анализа каждого HTTP/S-запроса до того, как он достигнет сервера. Он действует как посредник между пользователем и приложением, управляя всей коммуникацией до обращения к серверу. Shieldon гарантирует, что могут выполняться только разрешенные действия на основе политики безопасности. Поэтому крайне важно настроить WAF вроде Shieldon, чтобы обеспечить наличие автоматизированных процедур безопасности, которые мониторят сервер и защищают его от вредоносной активности. Они также гарантируют, что владельцы приложений имеют полный контроль и обзор среды безопасности своего приложения.