From: Makoto Kuwata Date: 2007-12-05T18:31:53+09:00 Subject: [ruby-list:44309] Re: multipartで送信した時のRails/cgi.rbの動作について ------=_Part_121_23046374.1196847105966 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Content-Disposition: inline 桑田といいます。 DRbのほうは分からないので、tempfileのほうだけ。 On Dec 3, 2007 4:35 AM, KOSEKI Kengo wrote: > 空のフィールドを大量に作ってmultipartで送信すると、 > テンポラリファイルが大量に作成されます。 > この現象は、Linuxでも確認しました。 > > 1000個のフィールドで800個ほどのファイルが作成されていましたが、 > これは想定されている動作でしょうか? cgi.rbの仕様でしょう(Railsもcgi.rbを使っていたと思います)。 CGI::QueryExtension#read_multipart()を見ると、multipartの場合、 だけでなく type="text" や type="radio" などの パラメータもすべてTempfile(またはStringIO)オブジェクトに格納 しています。 動作自体は仕様通りだと思うのですが、そもそもこの仕様が正しいのかと いう疑問はあります。 type="file" の場合は値がTempfileオブジェクトでいいと思いますが、 type="text" や type="radio" までもがTempfileオブジェクトになるのは なんか間違ってるように思います。 Content-Disposition で filename が指定されていた場合のみTempfileに して、それ以外はStringでいいように思います。 > 繰り返しpostするとDOS攻撃に利用できそうだと思ったんですが……。 > このくらいは平気なものでしょうか。 確かに、個数制限を設けたほうがいいと思います。 あと、1ファイルあたりのデータサイズの制限とかも。 今のcgi.rbだと、際限なく受け付けてしまいます。 試しにパッチを作成してみました。Ruby1.8.6のcgi.rbをもとにしています。 ・データサイズがCGI::MAX_DATASIZE(=64*1024*1024)を超えると例外を発生 ・パラメータ数がCGI::MAX_NUMPARAMS(=256)を超えると例外を発生 どの例外クラスを使うべきか分からなかったのでStandardErrorにしてます。 パッチはメールに添付しますので、興味があれば試してみてください。 -- makoto kuwata ------=_Part_121_23046374.1196847105966 Content-Type: application/octet-stream; name=cgi.rb.diff Content-Transfer-Encoding: base64 X-Attachment-Id: f_f9tno6dt0 Content-Disposition: attachment; filename=cgi.rb.diff LS0tIC91c3IvbG9jYWwvbGliL3J1YnkvMS44L2NnaS5yYgkyMDA3LTAzLTEzIDAyOjU1OjAzLjAw MDAwMDAwMCArMDkwMAorKysgY2dpLnJiCTIwMDctMTItMDUgMTg6MTA6MTMuMDAwMDAwMDAwICsw OTAwCkBAIC05MDUsMTAgKzkwNSwxOCBAQAogICAgIGVuZAogCiAgICAgcGFyYW1zCiAgIGVuZAog CisKKyAgIyBNYXhpbXVtIGRhdGEgc2l6ZQorICBNQVhfREFUQVNJWkUgID0gNjQgKiAxMDI0ICog MTAyNAorCisgICMgTWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdCBwYXJhbWV0ZXJzCisgIE1BWF9O VU1QQVJBTVMgPSAyNTYKKworCiAgICMgTWl4aW4gbW9kdWxlLiBJdCBwcm92aWRlcyB0aGUgZm9s bG93IGZ1bmN0aW9uYWxpdHkgZ3JvdXBzOgogICAjCiAgICMgMS4gQWNjZXNzIHRvIENHSSBlbnZp cm9ubWVudCB2YXJpYWJsZXMgYXMgbWV0aG9kcy4gIFNlZSAKICAgIyAgICBkb2N1bWVudGF0aW9u IHRvIHRoZSBDR0kgY2xhc3MgZm9yIGEgbGlzdCBvZiB0aGVzZSB2YXJpYWJsZXMuCiAgICMKQEAg LTk4MiwxMyArOTkwLDE5IEBACiAgICAgICAgIHJhaXNlIEVPRkVycm9yLCAibm8gY29udGVudCBi b2R5IgogICAgICAgZWxzaWYgYm91bmRhcnkgKyBFT0wgIT0gc3RhdHVzCiAgICAgICAgIHJhaXNl IEVPRkVycm9yLCAiYmFkIGNvbnRlbnQgYm9keSIKICAgICAgIGVuZAogCisgICAgICBtYXhfZGF0 YXNpemUgPSBNQVhfREFUQVNJWkUKKyAgICAgIG1heF9udW1wYXJhbXMgPSBNQVhfTlVNUEFSQU1T CisgICAgICBuID0gMAorCiAgICAgICBsb29wIGRvCisgICAgICAgIHJhaXNlIFN0YW5kYXJkRXJy b3IubmV3KCJ0b28gbWFueSBwYXJhbWV0ZXJzLiIpIGlmIChuICs9IDEpID4gbWF4X251bXBhcmFt cworCiAgICAgICAgIGhlYWQgPSBuaWwKLSAgICAgICAgaWYgMTAyNDAgPCBjb250ZW50X2xlbmd0 aAorICAgICAgICBpZiBidWZzaXplIDwgY29udGVudF9sZW5ndGgKICAgICAgICAgICByZXF1aXJl ICJ0ZW1wZmlsZSIKICAgICAgICAgICBib2R5ID0gVGVtcGZpbGUubmV3KCJDR0kiKQogICAgICAg ICBlbHNlCiAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgIHJlcXVpcmUgInN0cmluZ2lvIgpA QCAtMTAxMCwxMCArMTAyNCwxMSBAQAogICAgICAgICAgICAgbmV4dAogICAgICAgICAgIGVuZAog CiAgICAgICAgICAgaWYgaGVhZCBhbmQgKCAoRU9MICsgYm91bmRhcnkgKyBFT0wpLnNpemUgPCBi dWYuc2l6ZSApCiAgICAgICAgICAgICBib2R5LnByaW50IGJ1ZlswIC4uLiAoYnVmLnNpemUgLSAo RU9MICsgYm91bmRhcnkgKyBFT0wpLnNpemUpXQorICAgICAgICAgICAgcmFpc2UgU3RhbmRhcmRF cnJvci5uZXcoImRhdGEgaXMgdG9vIGxhcmdlLiIpIGlmIGJvZHkucG9zID4gbWF4X2RhdGFzaXpl CiAgICAgICAgICAgICBidWZbMCAuLi4gKGJ1Zi5zaXplIC0gKEVPTCArIGJvdW5kYXJ5ICsgRU9M KS5zaXplKV0gPSAiIgogICAgICAgICAgIGVuZAogCiAgICAgICAgICAgYyA9IGlmIGJ1ZnNpemUg PCBjb250ZW50X2xlbmd0aAogICAgICAgICAgICAgICAgIHN0ZGlucHV0LnJlYWQoYnVmc2l6ZSkK QEAgLTEwMzMsMTAgKzEwNDgsMTEgQEAKICAgICAgICAgICAgIGNvbnRlbnRfbGVuZ3RoID0gLTEK ICAgICAgICAgICBlbmQKICAgICAgICAgIGJvdW5kYXJ5X2VuZCA9ICQyLmR1cAogICAgICAgICAg ICIiCiAgICAgICAgIGVuZAorICAgICAgICByYWlzZSBTdGFuZGFyZEVycm9yLm5ldygiZGF0YSBp cyB0b28gbGFyZ2UuIikgaWYgYm9keS5wb3MgPiBtYXhfZGF0YXNpemUKIAogICAgICAgICBib2R5 LnJld2luZAogCiAgICAgICAgIC9Db250ZW50LURpc3Bvc2l0aW9uOi4qIGZpbGVuYW1lPSg/OiIo KD86XFwufFteXCJdKSopInwoW147XSopKS9uaS5tYXRjaChoZWFkKQogCWZpbGVuYW1lID0gKCQx IG9yICQyIG9yICIiKQo= ------=_Part_121_23046374.1196847105966--