end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

apache or CGI.pm でhttp requestのPOST容量を制限

apacheでは、httpd.confにLimitRequestBodyを指定

http://httpd.apache.org/docs/2.2/ja/mod/core.html

例えば、apacheで10kbyteの容量制限を行う場合、httpd.confに次のように記載します。
※grobal, , のコンテキストに指定できます

LimitRequestBody 10240

この状態で130kbyteのファイルをpostすると、サーバへの接続が切断され、access_logやerror_logには、次のように表示されさます。

access_log

192.168.0.1 - endou021 [22/Feb/2009:11:16:35 +0900] "POST <略> HTTP/1.1" 500 1188

error_log

[Sun Feb 22 11:16:35 2009] [error] [client 192.168.0.1] Requested content-length of 138833 is larger than the configured limit of 10240, <略>
[Sun Feb 22 11:16:35 2009] [error] [client 192.168.0.1] (-3)Unknown error 4294967293: Error reading request entity data, <略>

CGI.pmでは、POST_MAXを指定

CGI.pmではPOST_MAXを指定することで、requestデータの容量を制限でき、POST_MAXより大きなファイルを受領した場合、cgi_errorで検知できます。

use CGI;

$CGI::POST_MAX = 1024 * 100; #100kbyte
my $q = CGI->new();

$q->param;
#POST_MAXより大きなファイルを受領した場合、cgi_errorで検知
die($q->cgi_error) if ($q->cgi_error);

my $fh    = $query->upload('file') or die "can't upload file ";
my $file  = $query->param('file');


実際のサービスでは、LimitRequestBodyと$CGI::POST_MAXはどちらかを指定するのではなく、両方を指定しますよね。