Laravel

このガイドでは、LaravelアプリケーションにShieldonファイアウォールを実装する方法について説明します。以下の手順はLaravel 5と6でテストされています。

これらのヒントは唯一の方法ではありませんが、いくつかのアイデアを提供します。

Laravelフレームワークのファイアウォール

インストール

PHP Composerを使用します:

composer require shieldon/shieldon

これにより、Shieldonに必要な依存関係もインストールされます:

  • shieldon/psr-http PSR-7、15、17の実装であり、完全なドキュメントと詳細なテストが含まれています。
  • shieldon/event-dispatcher 最もシンプルなイベントディスパッチャーです。
  • shieldon/web-security ウェブセキュリティに関連する機能のコレクションです。
  • shieldon/messenger Telegram、Line、RocketChat、Slack、SendGrid、MailGunなどのサードパーティAPIやサービスにメッセージを送信するためのモジュールのコレクションです。

実装

Shieldonをミドルウェアとして使用するか、ウェブアプリケーションのブートストラップステージで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ファイアウォールはグローバルスコープで実行されます。ただし、Shieldonファイアウォールが無視するURLの除外リストを設定することもできます。

ミドルウェア

カスタムミドルウェアを定義するか、提供される統合クラスを使用することができます。

統合クラスを使用する場合は、ステップ1をスキップしてステップ2-2に進んでください。

1. ミドルウェアの定義

次のコマンドを実行して、ShieldonFirewallという名前のミドルウェアを作成します。

php artisan make:middleware ShieldonFirewall

その後、ShieldonFirewallミドルウェアクラスのhandleメソッドを次のコードで更新してください。

<?php

namespace App\Http\Middleware;

use Closure;

class ShieldonFirewall
{
    /**
     * リクエストの処理を行います。
     *
     * @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', '(.*)');

Shieldonファイアウォールは、Daemon設定セクションで有効になっている場合にウェブサイトを監視し始めます。設定を正しく行ったことを確認してください。