В данном подробном руководстве предоставляется подробный обзор начала работы с брандмауэром Shieldon для веб-приложения. Разберем его по частям.
Перед использованием брандмауэра Shieldon убедитесь, что ваш сервер соответствует следующим требованиям:
Shieldon может быть установлен с помощью Composer для PHP:
composer require shieldon/shieldon
Существуют три основных способа реализации Shieldon в вашем приложении:
Каждый метод реализации сопровождается практическими примерами использования популярных фреймворков, таких как Slim 4, Laravel 6 и CodeIgniter 3.
Пример: Фреймворк Slim 4
Shieldon может быть использован в качестве промежуточного программного обеспечения PSR-15, как показано на примере с использованием фреймворка Slim 4.
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;
}
}
Например, если вы используете фреймворк Slim 4, код должен выглядеть следующим образом.
$app->add(new FirewallMiddleware());
Например, если вы используете фреймворк 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/');
});
Примечание:
POST
и GET
должны быть применены к вашему веб-сайту.POST
необходим для разрешения CAPTCHA для временно блокированных пользователей.Пример: Фреймворк Laravel 6
Вы можете инициализировать Shieldon на этапе запуска вашего приложения, как показано на примере с использованием фреймворка Laravel 6.
В вашем файле 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);
}
}
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.
Создайте новый файл MY_Controller.php
в каталоге application/core/
. Это будет ваш родительский контроллер.
Вот базовая структура MY_Controller
:
class MY_Controller extends CI_Controller
{
public function __construct()
{
parent::__construct();
}
}
Затем инициализируйте брандмауэр 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();
}
}
Затем вам необходимо определить контроллер для панели управления брандмауэра 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
, соответственно. По соображениям безопасности рекомендуется изменить учетные данные после первого входа.