Начало работы

В данном подробном руководстве предоставляется подробный обзор начала работы с брандмауэром Shieldon для веб-приложения. Разберем его по частям.

Требования к серверу

Перед использованием брандмауэра Shieldon убедитесь, что ваш сервер соответствует следующим требованиям:

  • PHP >= 7.1.0
  • Расширение PHP Ctype
  • Расширение PHP JSON
  • Расширение PHP GD *(Необходимо для генерации изображений кодов проверки Captcha.)
  • Расширение PHP PDO (требуется только при использовании драйвера MySQL или SQLite)
  • Расширение PHP Redis (требуется только при использовании драйвера Redis)

Установка

Shieldon может быть установлен с помощью Composer для PHP:

composer require shieldon/shieldon

Реализация

Существуют три основных способа реализации Shieldon в вашем приложении:

  • Реализовать Shieldon в качестве промежуточного программного обеспечения PSR-15.
  • Реализовать Shieldon на этапе запуска приложения.
  • Реализовать Shieldon в родительском контроллере, от которого наследуются другие контроллеры.

Каждый метод реализации сопровождается практическими примерами использования популярных фреймворков, таких как Slim 4, Laravel 6 и CodeIgniter 3.


Промежуточное программное обеспечение PSR-15

Пример: Фреймворк Slim 4

Shieldon может быть использован в качестве промежуточного программного обеспечения PSR-15, как показано на примере с использованием фреймворка Slim 4.

(1) Создание промежуточного программного обеспечения брандмауэра.

class FirewallMiddleware
{
    /**
     * Пример класса промежуточного программного обеспечения
     *
     * @param ServerRequest  $request  Запрос PSR-7
     * @param RequestHandler $handler  Обработчик запроса PSR-15
     *
     * @return Response
     */
    public function __invoke(Request $request, RequestHandler $handler): Response
    {
        $response = $handler->handle($request);

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

        // Директория, в которую брандмауэр Shieldon поместит свои файлы.
        $firewall->configure(__DIR__ . '/../cache/shieldon_firewall');
        $response = $firewall->run();

        if ($response->getStatusCode() !== 200) {
            $httpResolver = new \Shieldon\Firewall\HttpResolver();
            $httpResolver($response);
        }

        return $response;
    }
}

(2) Добавление промежуточного программного обеспечения брандмауэра в ваше приложение.

Например, если вы используете фреймворк Slim 4, код должен выглядеть следующим образом.

$app->add(new FirewallMiddleware());

(3) Создание маршрута для панели управления.

Например, если вы используете фреймворк Slim 4, код должен выглядеть следующим образом. Затем вы сможете получить доступ к URL https://вашсайт.com/firewall/panel для входа в панель управления.

$app->any('/firewall/panel[/{params:.*}]', function (Request $request, Response $response, $args) {
    $firewall = new \Shieldon\Firewall\Firewall($request, $response);

    // Директория, в которую брандмауэр Shieldon поместит свои файлы.
    // Должна быть такой же, как и в FirewallMiddleware.
    $firewall->configure(__DIR__ . '/../cache/shieldon_firewall');

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

    // Базовый URL для панели управления.
    $panel->entry('/firewall/panel/');
});

Примечание:

  • HTTP-методы POST и GET должны быть применены к вашему веб-сайту.
  • Метод POST необходим для разрешения CAPTCHA для временно блокированных пользователей.

Этап запуска

Пример: Фреймворк Laravel 6

Вы можете инициализировать Shieldon на этапе запуска вашего приложения, как показано на примере с использованием фреймворка Laravel 6.

(1) Перед инициализацией $app

В вашем файле bootstrap/app.php, после <?php, добавьте следующий код.

/*
|--------------------------------------------------------------------------
| Запустить брандмауэр Shieldon
|--------------------------------------------------------------------------
|
| Брандмауэр Shieldon будет контролировать все HTTP-запросы, поступающие на ваш сайт.
| Запуск брандмауэра Shieldon перед инициализацией Laravel поможет избежать возможных
| конфликтов со встроенными функциями Laravel.
*/
if (isset($_SERVER['REQUEST_URI'])) {

    // Этот каталог должен иметь права на запись.
    // Мы помещаем его в каталог `storage/shieldon_firewall`.
    $storage =  __DIR__ . '/../storage/shieldon_firewall';

    $firewall = new \Shieldon\Firewall\Firewall();
    $firewall->configure($storage);
    $response = $firewall->run();

    if ($response->getStatusCode() !== 200) {
        $httpResolver = new \Shieldon\Firewall\HttpResolver();
        $httpResolver($response);
    }
}

(2) Определение маршрута для панели управления брандмауэра.

Route::any('/firewall/panel/{path?}', function() {

    $panel = new \Shieldon\Firewall\Panel();
    $panel->csrf(['_token' => csrf_token()]);

    // Точка входа должна быть такой же, как и определенный маршрут.
    $panel->entry('/firewall/panel/');

})->where('path', '(.*)');

Родительский контроллер

Пример: Фреймворк CodeIgniter 3

Shieldon также может быть реализован в родительском контроллере, от которого наследуются другие контроллеры, как показано на примере с использованием фреймворка CodeIgniter 3.

  1. Создайте родительский контроллер.

Создайте новый файл MY_Controller.php в каталоге application/core/. Это будет ваш родительский контроллер.

Вот базовая структура MY_Controller:

class MY_Controller extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
    }
}
  1. Инициализируйте экземпляр Firewall

Затем инициализируйте брандмауэр Shieldon в конструкторе MY_Controller. Это гарантирует, что брандмауэр Shieldon будет инициализирован для каждого контроллера, наследующего MY_Controller.

class MY_Controller extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();

        // Автозагрузчик Composer
        require_once APPPATH . '../vendor/autoload.php';

        // Этот каталог должен иметь права на запись.
        $storage = APPPATH . 'cache/shieldon_firewall';

        $firewall = new \Shieldon\Firewall\Firewall();
        $firewall->configure($storage);
        $response = $firewall->run();

        if ($response->getStatusCode() !== 200) {
            $httpResolver = new \Shieldon\Firewall\HttpResolver();
            $httpResolver($response);
        }
    }

    /**
     * Защита брандмауэра Shieldon.
     */
    public function firewall()
    {
        $firewall = \Shieldon\Container::get('firewall');
        $firewall->run();
    }
}
  1. Определите контроллер для панели управления.

Затем вам необходимо определить контроллер для панели управления брандмауэра Shieldon. В этом примере вы создадите контроллер с именем Firewall.

Создайте новый файл Firewall.php в каталоге application/controllers/ и добавьте следующий код:

class Firewall extends MY_Controller
{
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Это точка входа в нашу панель управления брандмауэра.
     */
    public function panel()
    {
        $panel = new \Shieldon\Firewall\Panel();
        $panel->entry('/firewall/panel/');
    }
}

Теперь брандмауэр Shieldon инициализирован в вашем MY_Controller, и каждый контроллер, наследующий MY_Controller и выполняющий метод firewall, будет иметь к нему доступ. Кроме того, вы определили контроллер Firewall с методом panel, который является точкой входа в панель управления брандмауэра Shieldon.

Вход в систему

Наконец, независимо от выбранного метода реализации, доступ к https://yoursite.com/firewall/panel/ должен отображать страницу входа.

Имя пользователя и пароль по умолчанию: shieldon_user и shieldon_pass, соответственно. По соображениям безопасности рекомендуется изменить учетные данные после первого входа.