這個指南將幫助您在 Laravel 應用程序中實作 Shieldon 防火牆。以下步驟已在 Laravel 5 和 6 上進行過測試。
這些提示不是唯一的實作方式,但也給您一些思路。
使用 PHP Composer:
composer require shieldon/shieldon
這也會安裝 Shieldon 所需的依賴套件:
您可以將 Shieldon 作為 中間件 使用,或在您的 Web 應用程序的 啟動階段 實作 Shieldon。
在應用程序的啟動階段初始化 Shieldon,通常在引入 Composer 自動加載程序後立即執行。這種方式是首選的,以避免可能與 Laravel 內置函數發生衝突。
在您的 bootstrap/app.php
文件中的 <?php
後面添加以下程式碼。
/*
|--------------------------------------------------------------------------
| 執行 Shieldon 防火牆
|--------------------------------------------------------------------------
|
| Shieldon 防火牆將監視所有發送到您網站的 HTTP 請求。
| 在初始化 Laravel 之前運行 Shieldon 防火牆可避免可能與 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);
}
}
在 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 設置一個排除列表。
您可以自己定義一個中間件,或使用提供的 整合類。
如果選擇使用整合類,跳過第 1 步,轉到第 2-2 步。
運行以下命令來創建一個名為 ShieldonFirewall
的中間件:
php artisan make:middleware ShieldonFirewall
然後,將 ShieldonFirewall
中間件類的 handle
方法更新為以下程式碼:
<?php
namespace App\Http\Middleware;
use Closure;
class ShieldonFirewall
{
/**
* Handle an incoming request.
*
* @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);
}
}
更新 app/Http/Kernel.php
文件,將以下行添加到 $routeMiddleware
屬性中:
對於第 2-1 步:
'firewall' => \App\Http\Middleware\ShieldonFirewall::class,
對於第 2-2 步(使用整合類):
如果您使用了整合類,程式碼如下所示:
'firewall' => \Shieldon\Firewall\Integration\Laravel::class,
在 routes/web.php
文件中添加以下路由:
Route::any('/firewall/panel/{path?}', function () {
$panel = new \Shieldon\Firewall\Panel();
$panel->csrf(['_token' => csrf_token()]);
$panel->entry();
})->where('path', '(.*)');
如果在「Daemon」設定部分啟用了 Shieldon 防火牆,它將開始監視您的網站。請確保您已正確設置這些設定。
firewall
中間件分配給路由將 firewall
中間件分配給您想要保護的任何路由。例如:
Route::any('/', function () {
return view('welcome');
})->middleware('firewall');
就是這樣。
您可以通過在瀏覽器中訪問 /firewall/panel/
來訪問控制面板。
https://for.example.com/firewall/panel/
默認登錄帳號是 shieldon_user
,密碼是 shieldon_pass
。登錄防火牆面板後,您應該首先更改登錄帳號和密碼。
如果在「Daemon」設定部分啟用了 Shieldon 防火牆,它將開始監視您的網站。請確保您已正確設置這些設定。