Laravel

這個指南將幫助您在 Laravel 應用程序中實作 Shieldon 防火牆。以下步驟已在 Laravel 5 和 6 上進行過測試。

這些提示不是唯一的實作方式,但也給您一些思路。

Laravel 框架中的防火牆

安裝

使用 PHP Composer:

composer require shieldon/shieldon

這也會安裝 Shieldon 所需的依賴套件:

實作

您可以將 Shieldon 作為 中間件 使用,或在您的 Web 應用程序的 啟動階段 實作 Shieldon。

啟動階段

在應用程序的啟動階段初始化 Shieldon,通常在引入 Composer 自動加載程序後立即執行。這種方式是首選的,以避免可能與 Laravel 內置函數發生衝突。

(1)在初始化 $app 之前

在您的 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);
    }
}

(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 設置一個排除列表。

中間件

您可以自己定義一個中間件,或使用提供的 整合類

如果選擇使用整合類,跳過第 1 步,轉到第 2-2 步。

1. 定義中間件

運行以下命令來創建一個名為 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);
    }
}

2. 註冊中間件別名

更新 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', '(.*)');

如果在「Daemon」設定部分啟用了 Shieldon 防火牆,它將開始監視您的網站。請確保您已正確設置這些設定。

4. 將 firewall 中間件分配給路由

firewall 中間件分配給您想要保護的任何路由。例如:

Route::any('/', function () {
    return view('welcome');

})->middleware('firewall');

就是這樣。

控制面板

您可以通過在瀏覽器中訪問 /firewall/panel/ 來訪問控制面板。

https://for.example.com/firewall/panel/

默認登錄帳號是 shieldon_user,密碼是 shieldon_pass。登錄防火牆面板後,您應該首先更改登錄帳號和密碼。

如果在「Daemon」設定部分啟用了 Shieldon 防火牆,它將開始監視您的網站。請確保您已正確設置這些設定。