こんな記事昔書いたんですけど、__本番環境では危険__であることが判明したので共有します。結論はタイトル通りです。
#事象
Plackの環境変数はサブルーチンの第一引数の(一般的にはmy $env = shift
として取得される)ハッシュリファレンスである一方、CGI::Sessionは環境変数$ENV{REMOTE_ADDR}
をコンストラクタで参照しており、CGIではない環境下において、これは常にundef
になり、空文字列同士で同一のホストとして判定されてしまいます。
つまり、異なるセッションを同一として判定してしまう脆弱性(これセッションハイジャックですよね?)を引き起こします。
#対策
- Plackの側で都度
$ENV{REMOTE_ADDR} = $env->{REMOTE_ADDR}
などとする?(かなりの魔改造なので私は断念) - 代わりにPlack::Sessionを使う
#まとめ
CGI::Sessionの良いところは$session->expire('user', '+1w' );
などといったパラメーターごとに期限を設定できる点にあると思いますが、やはりまぁ、名前通り、CGIのみに使った方が無難です。