浜松のWEBシステム開発・スマートフォンアプリ開発・RTK-GNSS関連の開発はお任せください
株式会社シーポイントラボ
TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:静岡県浜松市中区富塚町1933-1 佐鳴湖パークタウンサウス2F

【PHP】Slim3フレームワークのCSRF対策ミドルウェア「Slim-Csrf」の導入方法

勘違いから若干手こずったので、備忘録としてまとめ。
PHPフレームワーク「Slim3」でCSRF対策を行うためのミドルウェア「Slim-Csrf」の導入方法です。

GitHub のページはこちらから。

GitHub – slimphp/Slim-Csrf: Slim Framework CSRF protection middleware
https://github.com/slimphp/Slim-Csrf

サンプルコードも掲載されているので、分かりやすいはずなのですが…よくわからない勘違いをしたせいで、少し悩んでしまいました。

 

では、実装方法手順について。
なお、開発環境は「Slim-Skeleton」で作成したプロジェクトを使用しています。

まず下記のコマンドを実行して「Slim-Csrf」をインストールします。

composer require slim/csrf

インストールが完了したら、src/middleware.php を開き、下記のコードを追加します。

$container['csrf'] = function ($c) {
    return new \Slim\Csrf\Guard;
};
$app->add($container->get('csrf'));

上記を追加したら、次は src/routes.php を開いて、まずは下記のコードを追加します。

$app->get('/[任意のパス]', function (Request $request, Response $response, array $args) {
    $args['csrf_name'] = $request->getAttribute('csrf_name');
    $args['csrf_value'] = $request->getAttribute('csrf_value');

    // Render index view
    return $this->renderer->render($response, 'index.phtml', $args);
    // 任意のテンプレートに変更してもOK
});

こちらは、送信元のページです。
2、3行目のように、変数 $args に値を格納すれば、6行目で指定しているテンプレートでその値をしようできます。
上記コードでは、csrf_namecsrf_value に格納するランダムな値を生成し、それをテンプレートに渡しています。

次は、テンプレートファイルを開きます。
私の場合は、templates/index.phtml を使用します。
追加するコードは下記のとおり。なお、Form 部分だけを抜粋しています。


<form action="[送信先のパス]" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="csrf_name" value="<?=$csrf_name ?>">
    <input type="hidden" name="csrf_value" value="<?=$csrf_value ?>">
    <input type="file" name="picture" accept="image/*">
    <input type="submit" name="submit" value="送信">
</form>

重要なのが 2、3行目で、上の src/routes.php で生成した変数 csrf_name と csrf_value の値を、同名の input タグ(hidden)の value に格納しています。
これらの値を一緒に送ることで、他サイトから等の不正な書き込みを検知・防止することができます。

最後に、送信先の処理を、src/routes.php に記述します。

$app->post('[送信先のパス]', function (Request $request, Response $response, array $args) {
    $postParams = $request->getParsedBody();
    $uploadedFiles = $request->getUploadedFiles();
    $picture = $uploadedFiles['picture'];
    if ($picture->getError() === UPLOAD_ERR_OK) {
        // 送信されたファイルに行う処理
    }
});

といっても、生成したランダムな値のチェックは自動でやってくれるので、成功した場合は上記で記述した処理が実行されるようになっています。
そのため、こちらには送信したデータの処理内容だけを書けばOKです。

上記のコードでは、Form で画像データを送っているので、その送信されたファイルデータを取得しています。
アップロード等は、適宜行ってください。
なお、Slim3 のドキュメントにもファイルのアップロードに関する項目がありますので、参考にしてください。
リンクはこちら。

Uploading files using POST forms – Slim Framework
http://www.slimframework.com/docs/v3/cookbook/uploading-files.html

必要なコードは以上です。

 

以上、「Slim-Csrf」ミドルウェアを使用した、CSRF対策でした。
Slim-Skeleton で作成したプロジェクトがベースになっていますが、恐らく流用はできるはず。
参考にしていただければ幸いです。

  • この記事いいね! (0)