Если вас интересует создание собственного веб-файервола (WAF) с использованием публичных API библиотеки Shieldon, вы можете создать систему, аналогичную Shieldon Firewall.
Вот пример, демонстрирующий работу Shieldon и предоставляющий руководство по ручной реализации Shieldon в вашем веб-приложении.
Ниже приведена диаграмма, иллюстрирующая жизненный цикл экземпляра Shieldon. Вам не обязательно понимать все сразу, но по мере настройки собственных компонентов, модулей CAPTCHA и других элементов, она станет полезным справочным материалом.
$kernel = new \Shieldon\Firewall\Kernel();
В этом примере в качестве драйвера данных используется SQLite.
$dbLocation = APPPATH . 'cache/shieldon.sqlite3';
$pdoInstance = new \PDO('sqlite:' . $dbLocation);
$kernel->setDriver(
new \Shieldon\Firewall\Driver\SqliteDriver($pdoInstance)
);
Компоненты Shieldon - это наборы правил для постоянного разрешения или запрета сессий.
В этом примере загружается компонент TrustedBot, чтобы разрешить популярным поисковым системам их ботам входить в процесс проверки, избегая последующих компонентов и фильтров.
$kernel->setComponent(
new \Shieldon\Firewall\Component\TrustedBot()
);
Если вы используете только один экземпляр ядра Shieldon в своем веб-приложении, вы можете проигнорировать эту настройку. Канал просто служит префиксом для имен таблиц данных.
$kernel->setChannel('web_project');
Эта настройка позволяет просматривать текущую страницу только 10 сессиям. Время истечения по умолчанию - 300 секунд.
$kernel->limitSession(10, 300);
Вы можете настроить сервис CAPTCHA, например Google reCAPTCHA.
$kernel->setCaptcha(
new \Shieldon\Firewall\Captcha\Recaptcha([
'key' => '6LfkOaUUAAAAAH-AlTz3hRQ25SK8kZKb2hDRSwz9',
'secret' => '6LfkOaUUAAAAAJddZ6k-1j4hZC1rOqYZ9gLm0WQh',
])
);
$result = $kernel->run();
if ($result !== $kernel::RESPONSE_ALLOW) {
if ($kernel->captchaResponse()) {
// Разблокировать текущую сессию.
$kernel->unban();
}
$response = $kernel->respond();
if ($response->getStatusCode() !== 200) {
$httpResolver = new \Shieldon\Firewall\HttpResolver();
$httpResolver($response);
}
}
И это все.