From: KOSEKI Kengo Date: 2007-12-06T17:36:07+09:00 Subject: [ruby-list:44319] Re: multipartで送信した時のRails/cgi.rbの動作について こせきです。 桑田さん、回答ありがとうございます。 On Dec 5, 2007 6:31 PM, Makoto Kuwata wrote: > 動作自体は仕様通りだと思うのですが、そもそもこの仕様が正しいのかと > いう疑問はあります。 > type="file" の場合は値がTempfileオブジェクトでいいと思いますが、 > type="text" や type="radio" までもがTempfileオブジェクトになるのは > なんか間違ってるように思います。 > Content-Disposition で filename が指定されていた場合のみTempfileに > して、それ以外はStringでいいように思います。 そうですよね……。 メモリの問題があるとしても、/tmpに空のファイルを 作る理由は無いと思いました。 最初はStringIOに入れておいて、そのフィールドの入力が 一定サイズを超えたらTempfileに移行するといいのではと 思ったんですが、、。 > > 繰り返しpostするとDOS攻撃に利用できそうだと思ったんですが……。 > > このくらいは平気なものでしょうか。 > > 確かに、個数制限を設けたほうがいいと思います。 > あと、1ファイルあたりのデータサイズの制限とかも。 > 今のcgi.rbだと、際限なく受け付けてしまいます。 うむむ。。 > 試しにパッチを作成してみました。Ruby1.8.6のcgi.rbをもとにしています。 ありがとうございます! 試してみます。 あと、大きなフォームをPOSTする実験をしていて、 いくつか自分が誤解していた事に気づきました。 ■ POST時に古いtmpファイルはクリアされる。 ソースをちゃんと追ってないんですが、そういう動作を しているようでした。無闇に増え続けるわけではないんですね。。 ■ tmpファイルが一定数以上になるとToo many open file で止まる。 Thu Dec 06 16:25:42 +0900 2007: Error calling Dispatcher.dispatch # 手元の環境だと1000個ちょっとで止まっていました。 その後しばらくはエラーになったりしますが、 サーバ(mongrel/webrick)は動作し続けるようでした。 止まるまでに数分かかっていて、たぶん irb(main):002:0> (1..1000).inject(0){|s,i| s + i} => 500500 50万回くらいループしているんだと思います。 -- koseki