モダンプログラマまで何光年?

Webアプリ制作周辺を漂っています。はやくHackerになりたい・・・

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組むのはだるいよねっていう時に重宝しそうです。(ちょっとドキュメントが少ないけど)