「安全な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::Cache
とCache::Memcached::IronPlate
を組み合わせてみた
P::S::S::Cache
を使うとCache::*
系のモジュールを使ってセッションの内容(Cookie に保存しているセッション ID に紐づく情報)を保存することができます。特に memcached インタフェースを使ったセッション保持はある程度の規模のアプリケーションを作る時にはよく用いられると思います。
本当はここを KyotoTycoon にしてみたよって話にしようと思ったんですが、Mac でうまく make できなかったので、今回は kazeburo さんが最近公開されていたC::M::鉄板
を使ってみることにしました。といっても、単にかませただけなのでなにも変わったことはしてないですが。。。
-
Plack::Session::Store::Cache – search.cpan.org
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 で書けると助かる!
-
Xslate now cooperates with Data::Section::Simple – Islands in the byte stream
-
Text::Xslate::Syntax::Kolon – search.cpan.org
my $tx = Text::Xslate->new( path => [ Data::Section::Simple->new()->get_data_section(), ], function => { md => html_builder { Text::Markdown::markdown(shift); }, }, );
おわりに
こんな感じで「安全な Web アプリケーションの作り方」は読みながら自分でアプリケーション作って試してみるといいですよ!サンプルとして PHP が付属してますが、自分で使っているアプリケーションに近い環境で試した方がいいですし。
まだ半分くらいしか読めてないですが、継続して読み進めていきたいと思います。すばらしい教科書!