■ 無限フォームからのPOST送信の弊害
私も バッドノウハウ という奴に毒されているのか、Perl のスクリプトを書く時は大抵が以前作ったコードを何の疑いも無くコピペしており、内容の完全性については結構おろそかにしてしまっている場合が多々あります。
というわけで、前々から疑問に思っていた「FORM から POST する量には制限はないの?」について調べてみた所、結構嫌な結果になってしまいました。
結論から言うと、合計1.3MB程度でINPUTフィールドが1万個あるフォームがすんなり送信出来ました。
これはつまり、POST されたデータを受け取る段階で、サイズもフィールドの数も考慮しないで処理を行った場合、無駄に1万回のループを発生させる事が可能という事を示しております。1万個以上は試していないのですが、何となくメモリの許す限りループしそうな気はします。Perl だし。
うちのショボイスペックのサーバで検証した所、このフォームを送信した場合の処理速度は、何もない時に比べて200倍以上の時間が掛かりました。途中で jcode なんかで文字コードを変換したりすると、もっと時間が掛かってしまう事でしょう。
フィールド数を数えて、ある程度まで行ったらエラーを出すのと、length 等をチェックして、異常に大きい場合はエラーを出す、両方の対策をした方がいいでしょう。片方だけ対策しても駄目。
ざっと調べてみた所、この脆弱性(?)が発生すると考えられるデコード処理を行っている方は 結構いそう な感じです。お気付きの通り私も対策をしていませんでした。
ついでに言うと、Cookie の処理についても同じようにループ処理させている場合、やっぱり沢山ループしてしまうかもしれません。未検証なので不明ですが、気を付けるに越した事はないですね。
ところで、FORM から POST する量に制限はないんですか?:-)
ちなみに箱庭諸島はループ処理を行っていないので、箱庭管理人の方は安心して下さい。(笑
Posted by Kyosuke Takayama at 2003-12-09 (Tue) 17:26 printable version
1) かっちん (2003-12-15 (Mon) 19:37)
おお、なるほどぉ。かなり有意義な情報ですね。
確かにって感じですね。
私はフォーム受取関係は、ほとんど箱庭チックなことしかしない人なんで、これは考えたことなかったですし、気付かなかったですね。
私は、実はPerl=箱庭って言う感じの人でして、(^^;
最初に入り口が箱庭諸島だったんで、自分でCGI作る時も
箱庭チックな作りなんです。(^^;
で、その後色々他のCGIスクリプトとかCGIのサイトとか、幅を広げた時に、へぇこういう風にする方法もあるかぁとか思ったことがあったんですが、色々検討とかセキュリティーのこととか学ぶようになって、箱庭諸島(徳岡さんのスクリプト)が、いかに安全性が優れているかって痛感したことがあり、今でも徳岡さん信者です(笑。他のスクリプトとか見て、便利そうなのとか見つけて、徳岡さんのスクリプトと比較して、何で徳岡さんはこんな便利じゃ「ない」方法で書いてるんだろうとか考えた時に、それがセキュリティー的に凄く安全であることを思い知らされたです。
十分な検討なしの妙なテクニックやスマートすぎるスクリプト刃危険だと思って、徳岡さんに見習って、非常にべたで限定的なスクリプトをめんどくさくても書く人っす(^^;
そう言えば、あっぽーさんのスクリプトもそんな感じですね。
あっぽーさんのスクリプトでもっとこうしたら、スマートだしかっちょよいのになぁとか思って、自分で手直ししてかっちょよく書き直して、実験で処理速度量ったら、あっぽーさんの方が優れてたりして、、(^^;
妙に技巧に走ったりスマートに決めたりする(かなり精緻な例外的な検討をする必要がある)より、少々長くなっても、限定的なべたなスクリプトの方がええんだな、、って、