November 2014

November 05, 2014

このエントリーをはてなブックマークに追加
表題のことがしたかった。

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 はユーザに認められたコンテキスト (VirtualHostDirectory コンテナ内、.htaccess など) で設定出来るのに対して、他の 〜Fields, 〜FieldSize, 〜Line はグローバルコンテキスト (httpd.conf) でしか設定出来ないので、一部スコープにしか影響しないものと全体に影響するものを一つの middleware で実現するのはどうなのよ?っていう感じもありますけど、逆に言えば、グローバルコンテキストでしか実現できなかったものを、一つの $app のスコープ内の挙動にとどめられるってのは考えようによってはメリットでもあるんじゃないかな?と考えました。

全体で DDoS 対策するべきであることは間違いありませんが、アプリケーションの用途や性質によって制限値を変えられたほうが幸せになれるケースもあるんじゃないかなぁとかおもいました。

「あっちがこのぐらいの値を要求するから、こっちは本当はこんなに必要ないし受け付けたくはないけど仕方なく大きめに設定してる」

みたいなケースには悪くないとおもいます。

まぁ、当初の目的は LimitRequestBody をやりたかっただけなので、同様のケースで困っている方がいれば是非ご利用ください。

こういうネタ書くの何年ぶりだろ。
うんこちんちん。


nipotan at 20:16 | Comments(0) | TrackBack(0) | 技術 
このエントリーをはてなブックマークに追加