New Class of Vulnerability in Perl Web Applicationsの`param`の挙動に関しての補足とか
New Class of Vulnerability in Perl Web Applicationsの紹介
つい最近のCGI.pmでは$cgi->param('foo')
をリストコンテキストで受けると警告が出るようになっているのですが、その背景にこういう話があったことを知りました。ちなみに、$cgi->param
の挙動変更に関してはFormValidatro::Liteにp-rが来てたので把握してた次第。
CGI.pmは今後は複数の値を受け取る場合は$cgi->multi_param()
を使うことが推奨される流れになっています。僕は元々のparam
の挙動はそんなに嫌いじゃないのですが、とは言え意図せぬ脆弱性を起こしうる挙動はよろしくないのでインターフェースを分けようとしているっていうのは妥当だと思います。
もともと、CGI.pmがどうしてこういう挙動になっているのかって言うような話は、miyagawaさんの"Perl: Why parameters() sucks and what we can do"を読むと詳しく書かれています。これはHash::MultiValueが生まれた経緯とかも書いてあって非常に面白いので一読をおすすめします。
Plack::RequestもCGI.pmに準拠したインターフェースになっているのですが、こういうコンテキストを利用した柔軟な設計は、書き手がコンテキストを意識しながらコードを書かないといけないので、初心者にやさしくなく危険であるという議論は前々からされていました。
特に近年はハッシュを利用した名前付き引数渡しが多用されるので余計に誤ってリスト展開されてしまう危険性が昔に比べて高く、しかもそれが近代的なORMのupdateメソッドだったりすると大変なことになる可能性があります。つまり、今の書き方にそぐわず、昔に比べて危険度が増している。
tokuhiromも少し前に「Perl 初心者がウェブアプリケーションを書く時に気をつけるべきこと」というエントリでそれについて書いて警鐘を鳴らしています。
ということで、今回のparam
の件はPerlを書いている人からすると既知の事象で、CGI.pmにそういう動きがあったことは興味深いなーというところです。