初めに

この包括的なガイドでは、ウェブアプリケーションのためのShieldonファイアウォールの始め方について詳しく説明します。以下に分けて説明します。

サーバー要件

Shieldonファイアウォールを使用する前に、サーバーが以下の要件を満たしていることを確認してください。

  • PHP >= 7.1.0
  • Ctype PHP拡張
  • JSON PHP拡張
  • GD PHP 拡張(キャプチャ検証コードの画像生成に必要です。)
  • PDO PHP拡張(MySQL、SQLiteドライバーを使用する場合のみ必要)
  • Redis PHP拡張(Redisドライバーを使用する場合のみ必要)

インストール

ShieldonはPHP Composerを使用してインストールできます。

composer require shieldon/shieldon

実装

アプリケーションにShieldonを実装する方法は3つあります。

  • PSR-15ミドルウェアとしてShieldonを実装する。
  • アプリケーションのブートストラップ段階でShieldonを実装する。
  • 他のコントローラーが拡張する親コントローラーでShieldonを実装する。

各実装方法には、Slim 4、Laravel 6、CodeIgniter 3などの人気のあるフレームワークを使用した実用例が用意されています。


PSR-15ミドルウェア

例:Slim 4フレームワーク

Shieldonは、Slim 4フレームワークを使用した例を示すように、PSR-15ミドルウェアとして使用することができます。

(1) ファイアウォールミドルウェアを作成します。

class FirewallMiddleware
{
    /**
     * 例のミドルウェア呼び出し可能クラス
     *
     * @param ServerRequest  $request PSR-7リクエスト
     * @param RequestHandler $handler PSR-15リクエストハンドラー
     *
     * @return Response
     */
    public function __invoke(Request $request, RequestHandler $handler): Response
    {
        $response = $handler->handle($request);

        $firewall = new \Shieldon\Firewall\Firewall($request, $response);

        // Shieldonファイアウォールがファイルを配置するディレクトリ。
        $firewall->configure(__DIR__ . '/../cache/shieldon_firewall');
        $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);

    // Shieldonファイアウォールがファイルを配置するディレクトリ。
    // FirewallMiddlewareと同じである必要があります。
    $firewall->configure(__DIR__ . '/../cache/shieldon_firewall');

    $panel = new \Shieldon\Firewall\Panel();

    // コントロールパネルのベースURL。
    $panel->entry('/firewall/panel/');
});

注意:

  • ウェブサイトには POSTGET の両方のHTTPメソッドを適用する必要があります。
  • 一時的にブロックされたユーザーがCAPTCHAを解決するためには、POSTメソッドが必要です。

ブートストラップ段階

例:Laravel 6フレームワーク

Laravel 6フレームワークを使用した例として、アプリケーションのブートストラップ段階でShieldonを初期化することができます。

(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);
    $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('/firewall/panel/');

})->where('path', '(.*)');

親コントローラー

例:CodeIgniter 3フレームワーク

Shieldonは、他のコントローラーが拡張する親コントローラーに実装することもできます。以下は、CodeIgniter 3フレームワークを使用した例です。

  1. 親コントローラーを作成します。

application/core/ ディレクトリに MY_Controller.php という新しいファイルを作成します。これが親コントローラーとなります。

以下は、MY_Controller の基本構造です。

class MY_Controller extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
    }
}
  1. ファイアウォールインスタンスを初期化します。

次に、MY_Controller のコンストラクターでShieldonファイアウォールを初期化します。これにより、MY_Controller を拡張するすべてのコントローラーでShieldonファイアウォールが初期化されるようになります。

class MY_Controller extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();

        // Composerのオートローダー
        require_once APPPATH . '../vendor/autoload.php';

        // このディレクトリは書き込み可能である必要があります。
        $storage = APPPATH . 'cache/shieldon_firewall';

        $firewall = new \Shieldon\Firewall\Firewall();
        $firewall->configure($storage);
        $response = $firewall->run();

        if ($response->getStatusCode() !== 200) {
            $httpResolver = new \Shieldon\Firewall\HttpResolver();
            $httpResolver($response);
        }
    }

    /**
     * Shieldonファイアウォールの保護。
     */
    public function firewall()
    {
        $firewall = \Shieldon\Container::get('firewall');
        $firewall->run();
    }
}
  1. コントロールパネル用のコントローラーを定義します。

次に、Shieldonファイアウォールのコントロールパネル用のコントローラーを定義する必要があります。この例では、Firewall という名前のコントローラーを作成します。

application/controllers/ ディレクトリに Firewall.php という新しいファイルを作成し、以下のコードを追加します。

class Firewall extends MY_Controller
{
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * これがShieldonファイアウォールのコントロールパネルのエントリーポイントです。
     */
    public function panel()
    {
        $panel = new \Shieldon\Firewall\Panel();
        $panel->entry('/firewall/panel/');
    }
}

これで、ShieldonファイアウォールはMY_Controller で初期化され、MY_Controller を拡張し、firewall メソッドを実行するすべてのコントローラーで使用できるようになりました。さらに、Shieldonファイアウォールのコントロールパネル用の Firewall コントローラーも定義されており、それがShieldonファイアウォールのコントロールパネルへのエントリーポイントとなっています。

ログイン

最後に、選択した実装方法に関係なく、https://yoursite.com/firewall/panel/ にアクセスすると、ログインページが表示されます。

デフォルトのユーザー名とパスワードは、それぞれ shieldon_usershieldon_pass です。セキュリティ上の理由から、最初のログイン後にログイン資格情報を変更することを強くお勧めします。