Laravel

Это руководство поможет вам реализовать брандмауэр Shieldon в вашем приложении Laravel. Следующие шаги протестированы на Laravel 5 и 6.

Эти советы не являются единственным способом сделать это, но также дают вам некоторые идеи.

Брандмауэр в фреймворке Laravel

Установка

Используйте PHP Composer:

composer require shieldon/shieldon

Это также установит необходимые зависимости для Shieldon:

  • shieldon/psr-http Реализация PSR-7, 15, 17 с полной документацией и обширным тестированием.
  • shieldon/event-dispatcher Простейший диспетчер событий.
  • shieldon/web-security Сборник функций, связанных с безопасностью веба.
  • shieldon/messenger Сборник модулей для отправки сообщений в сторонние API или сервисы, такие как Telegram, Line, RocketChat, Slack, SendGrid, MailGun и другие.

Реализация

Вы можете использовать Shieldon как промежуточное ПО (middleware) или реализовать Shieldon на этапе инициализации вашего веб-приложения.

Этап инициализации

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

(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);

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

    $response = $firewall->run();

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

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

Добавьте следующий маршрут в файл routes/web.php:

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

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

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

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

Промежуточное ПО (Middleware)

Вы можете определить собственное промежуточное ПО (middleware) или использовать предоставляемый класс интеграции.

Если вы выбираете использование класса интеграции, пропустите шаг 1 и перейдите к шагу 2-2.

1. Определение промежуточного ПО (Middleware)

Выполните следующую команду, чтобы создать промежуточное ПО (middleware) с названием ShieldonFirewall:

php artisan make:middleware ShieldonFirewall

Затем обновите метод handle класса промежуточного ПО (middleware) ShieldonFirewall следующим кодом:

<?php

namespace App\Http\Middleware;

use Closure;

class ShieldonFirewall
{
    /**
     * Обработка входящего запроса.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $firewall = new \Shieldon\Firewall\Firewall();

        // Каталог, в котором брандмауэр Shieldon будет размещать свои файлы.
        $storage = storage_path('shieldon_firewall');;

        $firewall->configure($storage);

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

        $firewall->getKernel()->setCaptcha(
            new Csrf([
                'name' => '_token',
                'value' => csrf_token(),
            ])
        );

        $response = $firewall->run();

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

        return $next($request);
    }
}

2. Регистрация псевдонима промежуточного ПО (Middleware)

Обновите файл app/Http/Kernel.php и добавьте следующую строку в свойство $routeMiddleware:

Для шага 2-1:

'firewall' => \App\Http\Middleware\ShieldonFirewall::class,

Для шага 2-2 (используя класс интеграции):

Если вы используете класс интеграции, код будет выглядеть следующим образом:

'firewall' => \Shieldon\Firewall\Integration\Laravel::class,

3. Определение маршрута для панели брандмауэра

Добавьте следующий маршрут в файл routes/web.php:

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

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

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

Брандмауэр Shieldon начнет отслеживать ваш веб-сайт, если он включен в разделе настроек Daemon. Убедитесь, что вы правильно настроили настройки.