Pages

2018年11月21日水曜日

[CakePHP3] 管理画面とそれ意外でCSRF用のCookieName(クッキー名)を変更したい

/src/Application.php のデフォルト指定をまず削除。
本当は設定を更新したかったが、方法が見つからず。。

$middlewareQueue->get(3) からできるかなと思ったけど無理だよね。。
てか名前も指定できるようになってたらいいのに。。
->add した瞬間にこれ実行してるのかな。。

まーとりあえず以下の方法で対応しました。

public function middleware($middlewareQueue)
{
    $middlewareQueue
        // Catch any exceptions in the lower layers,
        // and make an error page/response
        ->add(ErrorHandlerMiddleware::class)

        // Handle plugin/theme assets like CakePHP normally does.
        ->add(AssetMiddleware::class)

        // Add routing middleware.
        // Routes collection cache enabled by default, to disable route caching
        // pass null as cacheConfig, example: `new RoutingMiddleware($this)`
        // you might want to disable this cache in case your routing is extremely simple
        ->add(new RoutingMiddleware($this, '_cake_routes_'))

        // Add csrf middleware.
        ->add(new CsrfProtectionMiddleware([
            'cookieName' => 'csrf',
            'secure' => true,
            'httpOnly' => true,
        ]));

    return $middlewareQueue;
}

上記がデフォルトの内容となりますが、これから

// Add csrf middleware.
->add(new CsrfProtectionMiddleware([
    'cookieName' => 'csrf',
    'secure' => true,
    'httpOnly' => true,
]));

の部分を削除します。

public function middleware($middlewareQueue)
{
    $middlewareQueue
        // Catch any exceptions in the lower layers,
        // and make an error page/response
        ->add(ErrorHandlerMiddleware::class)

        // Handle plugin/theme assets like CakePHP normally does.
        ->add(AssetMiddleware::class)

        // Add routing middleware.
        // Routes collection cache enabled by default, to disable route caching
        // pass null as cacheConfig, example: `new RoutingMiddleware($this)`
        // you might want to disable this cache in case your routing is extremely simple
        ->add(new RoutingMiddleware($this, '_cake_routes_'));

    return $middlewareQueue;
}

するとこうなる。

/src/Application.php で分岐させても良いけど、Pluginのための分岐なので、
分岐はPlugin側でやる事に。
/plugins/Manage/config/bootstrap.php

ちなみに /plugins/Manage は管理画面用に作成したプラグイン。

plugins/Manage/config/bootstrap.php を更新。

以下の分岐を作成していたので、その中で

use Cake\Event\EventManager;
use Cake\Http\Middleware\CsrfProtectionMiddleware;

$cookieName = 'csrf';
if (!empty($_SERVER['REQUEST_URI']) && preg_match('/^\/manage*/', $_SERVER['REQUEST_URI'])) {
    $cookieName = 'mcsrf';
}

EventManager::instance()->on(
    'Server.buildMiddleware',
    function ($event, \Cake\Http\MiddlewareQueue $middlewareQueue) use ($cookieName) {
        $middlewareQueue->add(new CsrfProtectionMiddleware([
            'cookieName' => $cookieName,
            'secure' => true,
            'httpOnly' => true,
        ]));
    });

のように更新すればOK。

で、確認してたらどうも csrf、mcsrf の両方が登録されてしまう。

何故なんだろうとハマっていたら DebugBar のAjax?で呼んでいる様子。
なので、 DEBUG false にして確認したら無事 /manage 以下では mcsrf だけが利用されており、 /manage と それ以外 で別のクッキー値を参照するようになりましたとさ。

0 件のコメント:

コメントを投稿

Followers