PHP Web 应用程序防火墙
Shieldon 是适用于 PHP 的 Web 应用程序防火墙(WAF),具有漂亮实用的控制面板,可帮助您轻松管理防火墙规则和安全设置。
- 网站:https://shieldon.io
- GitHub 仓库:https://github.com/terrylinooo/shieldon
- WordPress 插件:https://wordpress.org/plugins/wp-shieldon/
安装
2.x 将于8月15日发布
composer require shieldon/shieldon ^2
1.x
composer require shieldon/shieldon ^1
指南:Shieldon 1.x文档
如何使用
此处的示例适用于 Shieldon 2。
您可以选择三种方法在应用程序上使用Shieldon。有三种方法可以选择在应用程序上使用 Shieldon。
- 将 Shieldon 实施为 PSR-15 中间件。
- 在应用程序的引导阶段实现 Shieldon。
- 在由其他控制器扩展的父控制器中实现 Shieldon。
Shieldon 2.x 实现了 PSR-7,因此它可以与现代框架(例如 Laravel,Symfony,Slim,Yii 等)兼容。在这种情况下,将 Shieldon 2.x 用作 PSR-15 中间件是最佳实践。
PSR-15 中间件
示例:Slim 4框架
在此示例中,我将向您提供一些有关如何将 Shieldon 实施为 PSR-15 中间件的提示。
我使用 Slim 4 框架进行演示。 只需稍作修改,该方法也可以用于支持 PSR-15 的任何框架。
(1)创建防火墙中间件。
class FirewallMiddleware
{
/**
* Example middleware invokable class
*
* @param ServerRequest $request PSR-7 request
* @param RequestHandler $handler PSR-15 request handler
*
* @return Response
*/
public function __invoke(Request $request, RequestHandler $handler): Response
{
$response = $handler->handle($request);
$firewall = new \Shieldon\Firewall\Firewall($request, $response);
// The directory in where Shieldon Firewall will place its files.
$firewall->configure(__DIR__ . '/../cache/shieldon_firewall');
// The base url for the control panel.
$firewall->controlPanel('/firewall/panel/');
$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://yourwebsite.com/firewall/panel 登录到控制面板。
$app->any('/firewall/panel[/{params:.*}]', function (Request $request, Response $response, $args) {
$firewall = new \Shieldon\Firewall\Firewall($request, $response);
// The directory in where Shieldon Firewall will place its files.
// Must be the same as firewallMiddleware.
$firewall->configure(__DIR__ . '/../cache/shieldon_firewall');
$panel = new \Shieldon\Firewall\Panel();
$panel->entry();
});
注意:
- HTTP 方法 POST 和 GET 都应应用于您的网站。
- 需要 POST 方法来解决被临时阻止的用户解决验证码的问题。
引导阶段
示例:Laravel 6 框架
在应用程序的引导阶段初始化 Shieldon,通常是在包含 composer autoloader 之后立即进行。
在此示例中,我使用 Laravel 6 进行演示。
(1)在初始化 $app 之前
在您的 bootstrap/app.php 中,在 <?php 之后,添加以下代码。
/*
|--------------------------------------------------------------------------
| Run The Shieldon Firewall
|--------------------------------------------------------------------------
|
| Shieldon Firewall will watch all HTTP requests coming to your website.
| Running Shieldon Firewall before initializing Laravel will avoid possible
| conflicts with Laravel's built-in functions.
*/
if (isset($_SERVER['REQUEST_URI'])) {
// This directory must be writable.
// We put it in the `storage/shieldon_firewall` directory.
$storage = __DIR__ . '/../storage/shieldon_firewall';
$firewall = new \Shieldon\Firewall\Firewall();
$firewall->configure($storage);
// The base url for the control panel.
$firewall->controlPanel('/firewall/panel/');
$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();
})->where('path', '(.*)');
父控制器
示例:CodeIgniter 3 框架
如果使用的是 MVC 框架,则在父控制器中实现 Shieldon 也是一个好主意。 在此示例中,我将使用 CodeIgniter 3 进行演示。
1、创建一个父控制器。
让我们在核心文件夹中创建一个 MY_Controller.php。
class MY_Controller extends CI_Controller
{
public function __construct()
{
parent::__construct();
}
}
2、初始化防火墙实例
将初始代码放入构造函数中,以便任何扩展MY_Controller的控制器都将初始化Shieldon Firewall,并准备好 $this->firewall() 方法。
class MY_Controller extends CI_Controller
{
public function __construct()
{
parent::__construct();
// Composer autoloader
require_once APPPATH . '../vendor/autoload.php';
// This directory must be writable.
$storage = APPPATH . 'cache/shieldon_firewall';
$firewall = new \Shieldon\Firewall\Firewall();
$firewall->configure($storage);
// The base url for the control panel.
$firewall->controlPanel('/firewall/panel/');
$response = $firewall->run();
if ($response->getStatusCode() !== 200) {
$httpResolver = new \Shieldon\Firewall\HttpResolver();
$httpResolver($response);
}
}
/**
* Shieldon Firewall protection.
*/
public function firewall()
{
$firewall = \Shieldon\Container::get('firewall');
$firewall->run();
}
}
3、为控制面板定义一个控制器。
我们需要一个控制器进入 Shieldon 防火墙控制面板,在此示例中,我们定义了一个名为 Firewall 的控制器。
class Firewall extends MY_Controller
{
public function __construct()
{
parent::__construct();
}
/**
* This is the entry of our Firewall Panel.
*/
public function panel()
{
$panel = new \Shieldon\Firewall\Panel();
$panel->entry();
}
}
最后,无论您选择哪种方式,输入https://yoursite.com/firewall/panel/,都将在屏幕上显示登录页面。
默认的用户和密码是 shield user 和 shield pass。首先要做的是在登录到控制面板后更改登录名和密码。
概念
这是有关 Shieldon 工作方式的基本概念。
- 网络层防火墙,例如CloudFlare。
- 系统层防火墙,例如iptables模块。
- 要在Web应用程序层中使用防火墙软件,我们能够在您的APP的早期阶段实施Shieldon,主要是在Composer自动加载器之后。
- Shieldon会分析您的所有HTTP和HTTPS请求。
- 一旦Shieldon检测到请求的异常行为,Shieldon就会临时禁止它们,并提示他们验证码以使其解除禁止。
- 如果某个请求连续多次失败(取决于您的设置),则该请求将在当前数据圈中被永久禁止。
- 如果请求已被永久禁止,但他们仍然可以访问您的页面,请将其放入系统层防火墙-iptables。
特性
- SEO友好,不影响SERP。
- Http型DDOS缓解。
- 反扒(Anti-scraping)。
- 限制在线用户数量。
- 跨站点脚本(XSS)保护。
- 中断漏洞扫描。
- 消除暴力攻击。
- IP管理员。
- 通过 WWW-Authenticate 保护页面。
- 详细的统计数据和图表。
- 向第三方服务发送通知。
- 用于管理 iptables(系统防火墙)的 Web UI。
实现
以下是与流行的 PHP 框架集成的指南。
防火墙面板
Shieldon 提供了一个防火墙实例,它的可视化界面称为防火墙面板。 通过使用 Shieldon 防火墙,您可以轻松地在 Web 应用程序上实现它。
点击 这里 查看演示。
- user:
demo - password:
demo
屏幕截图
(恕删略。请参见自述文件。)
帮助翻译
非常感谢您考虑为 Shieldon Firewall 做出贡献,但是我们需要您的帮助来翻译Shieldon 库中的 Webiste,文档和 i18n 文件。 这里是链接:
作者
Shieldon 库是由台湾的 Terry L. 带给您的。
许可证
Shieldon Firewall 是根据 MIT 许可获得许可的开源软件。
(The first version translated by vz on 2020.08.05)











