「安全なWebアプリケーションの作り方」を読んでセッションを復習してみた

タイトルが長くて略称があれば知りたい感じの「安全なWebアプリケーションの作り方」を暇を見つけて読んでいます。今まであいまいなままだった部分を順を追って説明してくれるので、本当に助かります。Webアプリ作りの初心者は卒業したかなーという人は必ず目を通しておくと良いと思います。

Cookieを用いたセッションについて復習

「HTTPはステートレスで」とかいう話はよく聞きますが、じゃあどうやってセッション管理するのがいいの?って話をよく考えると体系的に聞いたことがなかった!というわけで、この本で文字通り体系的に学び直すことができました。

その中でも、「セッションIDの固定化」という話題はちゃんと分かってなかった部分があったので、こちらのサイトを参考にPSGIなアプリケーションを作ってみました(僕の書いたアプリ自体はその他の脆弱性に溢れていますがw)。コードはエントリの最後に。

ポイント

実際のログイン処理を行う(パスワードの確認など)時に、セッションIDを新しくする

これをしないと、第3者から強制的に与えられたセッションIDを使ったままログインしてしまうと、第3者にセッションを乗っ取られてしまいます。そこで、ログイン処理時にセッションIDを作り直すことでこれを防ぐわけですね。Plack::Middleware::Sessionでのコードはこちら。

$req->session_options->{change_id}++;

これによって、ブラウザ側でCookieが新しくなり、アプリ側でも古いセッションが破棄されます。簡単ですねー。

おまけ

で、せっかくなので色んなモジュールを使ってみました。WAFを通さずこうやって自分でPSGIアプリを組み立てると動作原理の理解が深まっていい感じですね。

Plack::Session::Store::CacheCache::Memcached::IronPlateを組み合わせてみた

P::S::S::Cacheを使うとCache::*系のモジュールを使ってセッションの内容(Cookieに保存しているセッションIDに紐づく情報)を保存することができます。特にmemcachedインタフェースを使ったセッション保持はある程度の規模のアプリケーションを作る時にはよく用いられると思います。

本当はここをKyotoTycoonにしてみたよって話にしようと思ったんですが、Macでうまくmakeできなかったので、今回はkazeburoさんが最近公開されていたC::M::鉄板を使ってみることにしました。といっても、単にかませただけなのでなにも変わったことはしてないですが。。。

    enable 'Session',
        store => Plack::Session::Store::Cache->new(
            cache => Cache::Memcached::IronPlate->new(
                cache => Cache::Memcached::Fast->new({
                    servers => [{address => 'localhost:11211'}],
                }),
            ),
        );

なんか長いwこれでセッションの保存を複製すれば、と思ったけど、よく考えたらこれではキーを変えられないですね。というわけで、これはPlack::Session::Store::Cache::Memcached::IronPlateを作るのが良さそうです。今は作らない。。。><

Xslate初めてまじめに使ってみた&Markdownも使ってみた

gfxさんのXslateですがTTerseばっかりだったので、初めてKolonで使ってみました(cascadeがやってみたかった)。CloudForecastなども参考にしつつ書いてみましたが、まだよく分かってないかも。。。

あと、lestrratさんが書かれてたエントリを参考にText::MarkdownもXslateに組み込んで使ってみました。このブログはMarkdownで書いているので、個人的にはテンプレートをMarkdownで書けると助かる!

    my $tx = Text::Xslate->new(
        path => [
            Data::Section::Simple->new()->get_data_section(),
        ],
        function => {
            md => html_builder {
                Text::Markdown::markdown(shift);
            },
        },
    );

おわりに

こんな感じで「安全なWebアプリケーションの作り方」は読みながら自分でアプリケーション作って試してみるといいですよ!サンプルとしてPHPが付属してますが、自分で使っているアプリケーションに近い環境で試した方がいいですし。

まだ半分くらいしか読めてないですが、継続して読み進めていきたいと思います。すばらしい教科書!