November 2014
November 05, 2014
表題のことがしたかった。
Apache の core にある
日本語のドキュメントには明記されてないのに、英語のドキュメントには明記されている罠。
ということで、
Plack-Middleware-LimitRequest - search.cpan.org
使いかたは SYNOPSIS にある通りです。
そもそも、
全体で DDoS 対策するべきであることは間違いありませんが、アプリケーションの用途や性質によって制限値を変えられたほうが幸せになれるケースもあるんじゃないかなぁとかおもいました。
「あっちがこのぐらいの値を要求するから、こっちは本当はこんなに必要ないし受け付けたくはないけど仕方なく大きめに設定してる」
みたいなケースには悪くないとおもいます。
まぁ、当初の目的は
こういうネタ書くの何年ぶりだろ。
うんこちんちん。
Apache の core にある
LimitRequestBody
ってディレクティブ使ったら request body が巨大なのとか防げるんだとおもってたら、どうも mod_proxy を使って reverse proxy にしている場合、proxy するリクエストにこの制限は効かないらしい。日本語のドキュメントには明記されてないのに、英語のドキュメントには明記されている罠。
ということで、
LimitRequest*
のディレクティブのような挙動を Plack 環境でよしなにやってくれる middleware を書いたらいいんじゃね?ってなってサラっとでっちあげてみました。Plack-Middleware-LimitRequest - search.cpan.org
使いかたは SYNOPSIS にある通りです。
use Plack::Builder; my $app = sub { ... }; builder { enable 'LimitRequest', body => 102400, fields => 50, field_size => 4094, line => 4094 ; $app; };なんで、
LimitRequestBody
の実装だけにとどめなかったかっていうと、Plack が前段で動いているような奇抜な環境の場合にも制限できたほうが嬉しい人がこの世の中には若干いたりするんじゃないかな?という妄想をしたから。そもそも、
LimitRequest*
系ディレクティブって、〜Body はユーザに認められたコンテキスト (VirtualHost
や Directory
コンテナ内、.htaccess など) で設定出来るのに対して、他の 〜Fields, 〜FieldSize, 〜Line はグローバルコンテキスト (httpd.conf) でしか設定出来ないので、一部スコープにしか影響しないものと全体に影響するものを一つの middleware で実現するのはどうなのよ?っていう感じもありますけど、逆に言えば、グローバルコンテキストでしか実現できなかったものを、一つの $app のスコープ内の挙動にとどめられるってのは考えようによってはメリットでもあるんじゃないかな?と考えました。全体で DDoS 対策するべきであることは間違いありませんが、アプリケーションの用途や性質によって制限値を変えられたほうが幸せになれるケースもあるんじゃないかなぁとかおもいました。
「あっちがこのぐらいの値を要求するから、こっちは本当はこんなに必要ないし受け付けたくはないけど仕方なく大きめに設定してる」
みたいなケースには悪くないとおもいます。
まぁ、当初の目的は
LimitRequestBody
をやりたかっただけなので、同様のケースで困っている方がいれば是非ご利用ください。こういうネタ書くの何年ぶりだろ。
うんこちんちん。