【Laravel】Cookieのsecure属性とLaravelビルトインサーバ

著者:杉浦

【Laravel】Cookieのsecure属性とLaravelビルトインサーバ

 Cookieにはいくつか属性がつけられます。この記事で注目するのはsecure属性です

The Secure attribute limits the scope of the cookie to “secure”
channels (where “secure” is defined by the user agent). When a
cookie has the Secure attribute, the user agent will include the
cookie in an HTTP request only if the request is transmitted over a
secure channel (typically HTTP over Transport Layer Security (TLS)
[RFC2818]).

Although seemingly useful for protecting cookies from active network
attackers, the Secure attribute protects only the cookie’s
confidentiality. An active network attacker can overwrite Secure
cookies from an insecure channel, disrupting their integrity (see
Section 8.6 for more details).RFC 6265 – HTTP State Management Mechanism

 要はsecure属性付きのCookieはHTTP通信では送信されず、HTTPS通信では送信されるようにするオプションです。これは特に通信を盗聴されることが致命的な情報、セッション情報(これを盗ると通信を乗っ取れる)などのために用いられます。

 Laravelはartisan serveコマンドによって組み込みサーバを動かせます。このサーバはPHPのビルトインウェブサーバの仕組みを利用しています。
PHP: ビルトインウェブサーバー – Manual
 実装コードは次です。

/** vendor/laravel/framework/src/Illuminate/Foundation/Console/ServeCommand.php */
    /**
     * Execute the console command.
     *
     * @return int
     *
     * @throws \Exception
     */
    public function handle()
    {
        chdir(public_path());

        $this->line("<info>Laravel development server started:</info> <http://{$this->host()}:{$this->port()}>");

        passthru($this->serverCommand(), $status);

        return $status;
    }
    
    /**
     * Get the full server command.
     *
     * @return string
     */
    protected function serverCommand()
    {
        return sprintf('%s -S %s:%s %s',
            ProcessUtils::escapeArgument((new PhpExecutableFinder)->find(false)),
            $this->host(),
            $this->port(),
            ProcessUtils::escapeArgument(base_path('server.php'))
        );
    }

 要は

$ cd ~/public_html
$ php -S [host]:[port] /hoge/fuga/project_root/server.php

をartisanで実行しやすくしているだけです。呼び出しているserver.phpが次です。

/** server.php */
<?php

/**
 * Laravel - A PHP Framework For Web Artisans.
 * @author   Taylor Otwell <taylor@laravel.com>
 */
$uri = urldecode(
    parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
);

// This file allows us to emulate Apache's "mod_rewrite" functionality from the
// built-in PHP web server. This provides a convenient way to test a Laravel
// application without having installed a "real" web server software here.
if ('/' !== $uri && file_exists(__DIR__.'/public'.$uri)) {
    return false;
}

require_once __DIR__.'/public/index.php';

 安全にpublic/index.phpを呼び出しているだけです。public/index.phpはHTTPリクエスト全てを受け取る窓口です。つまりLaravelの組み込みサーバはPHPのビルトインウェブサーバのラッピングであり、そのサーバとしての機能はほとんど素のPHPのビルトインウェブサーバの素のままです。
 このためPHPのビルトインウェブサーバの不便な点はLaravelのビルトインサーバの不便な点と言えます。業務用web開発において特に不便な点はHTTPSによるセキュアな通信が出来ない点です。


 セキュアな通信ができないということは、セキュアな通信でなければ渡されない情報を使えない、ということです。その様な情報には冒頭で述べたSecure属性がtrueなCookieが含まれます。またセキュアなcookieであるべきものには盗聴されるとセッションの乗っ取りを容易にする情報であるセッション情報が含まれます。これによりLaravelビルトインサーバ上ではセキュアなプログラムを組んだままログイン情報を持ちまわせません。Laravelビルトインサーバではログインした状態でブラウザでどうこうすることができません。

 書いている途中で気づきましたが、artisan serveにはオプションがあります。

artisan serve --env=notsecure

 このように記述すると、Laravelは.env.notsecureの環境変数を読み込んでビルトインサーバを立ち上げます。.env.notsecureを読んだ時限定でHTTPSとHTTPを同等に扱えるようなオプションとコードを記述すればビルトインサーバでも大過なくテストできそうです。ただCSRFがらみは念入りにセキュアにされてるっぽそうな。
 とはいえ業務を考えた場合、コードには十分に安全なプログラムであることが要求されます。結局のところセキュアなことを確認するためにビルトインサーバを用いることはできないので、マシン本体、仮想マシン、外部サーバなりなんなりにapacheなどの運用状態と同等の環境を用意するのが業務としては安全で確実そうです。

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

著者について

杉浦 administrator