Perl製WAF MENTA ファイルのアップロードでハマったら
最近MENTAというPerl製WAFを使っていて、ちょっと躓いた点など。
MENTAはCGIでも高速に動作することがウリのWAF。
公式ページはここ→MENTA
Githubのリポジトリはここ→tokuhirom/menta · GitHub
あと、このブログの記事がよくまとまっていて、大変助かった→Perl 軽量Webフレームワーク MENTA を使ってみたよ - 八発白中
で、これらに載っていなくてちょっとハマった点を書こうと思う。
ファイルのアップロード
<form name="file_upload" method="post" action="<?= uri_for('upload/index') ?>" enctype="multipart/form-data"> <fieldset> <legend>ファイルアップロード</legend> <input type="file" name="upfile" value="" required="true" /><br /> <input type="submit" value="送信" /> </fieldset> </form>
例えば↑のようなフォームを使ってアップロードしたファイルを、CGI側で受け取る処理を書く際、menta.cgi内に↓の記述を追加する必要がある。
MENTAは内部でCGI::Simpleを利用してHTTPリクエストを処理している。
そして$CGI::Simple::DISABLE_UPLOADSがファイルのアップロードを受け付けるかどうかのスイッチになっているが、デフォルトでは受け付ない設定らしい。
$CGI::Simple::DISABLE_UPLOADS = 0;
と設定することで、コントローラでupload()関数が有効になる。
# アップロードされたファイルのファイルハンドルを返す my $fh = upload('upfile');
そして、アップロードできるファイルの容量は以下で設定できる。
# 10MBまでのファイルを受け付ける $CGI::Simple::POST_MAX = 1024 * 1000 * 10;
一応この記述がなくても小さな容量なら受け付けられるが、正確に何バイトまでのファイルがOKはわからない。
#!/usr/bin/perl BEGIN { unshift @INC, 'lib', 'cgi-extlib-perl/extlib'; }; use MENTA; $CGI::Simple::DISABLE_UPLOADS = 0; $CGI::Simple::POST_MAX = 1024 * 1000 * 10; MENTA->run_menta(do 'config.pl');
このように記述すれば良いみたい。
というわけでMENTAでファイルアップロードを使う際のメモでした。
後はドキュメントに載っていた気もするけど、見落としがちな点。
plugins/以下にプラグインファイルを書く時、関数名の頭をプラグインファイルと同じにしないと、アプリから呼び出す時にエラーになる。
# こうかけば良い package MENTA::Plugin::Mail; use MENTA::Plugin; use Carp; use Email::Send; sub mail_send { my $message = shift; my $sender = Email::Send->new( { mailer => 'SMTP' } ); $sender->mailer_args( [ Host => config->{smtp_host} ] ); $sender->send($message); } 1; # これは呼び出すとエラー sub send_mail { my $message = shift; my $sender = Email::Send->new( { mailer => 'SMTP' } ); $sender->mailer_args( [ Host => config->{smtp_host} ] ); $sender->send($message); }
要はプラグイン内では関数名に"package_hoge"(まずパッケージ名(小文字)、アンダースコアで区切って他の単語)という命名規則があるのですね。これも少しハマった。
内部でのみ利用する関数はこの限りではないです。
WAFはみんなそうかも知れないけど、MENTAも慣れればとても使いやすいフレームワークだと思う。
rootの取れないようなレンタルサーバ環境なんかで、一からCGI組むのはだるいよねっていう時に重宝しそうです。(ちょっとドキュメントが少ないけど)