Perl Perl_2
Perl 「 モジュール 」 CGI 実用的なファイルアップロード 12 アップロードの処理 Q (0x119)

目次 - Perl Index
Theme
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x119 回。
CGI.pm で、実用的なファイルアップロードの処理を確認する。その 12 回。実際のアップロードの処理を請け負うサブルーチンの中身を確認する。
ファイルのアップロード処理
Cgi upload - perlmeme.org で紹介されている、実用的なコードでは、次の様にしてサブルーチン「 save_fiel() 」にファイルアップロードのための処理を任せています。
if ($q->param()) {
save_file($q);
}
print $q->end_html;
exit 0;
今回は、このサブルーチンの処理の中で、ファイル名の入力と、文字列の汚染 ( taint ) チェック手順を確認します。
ファイル名の入力をチェックする
サブルーチン「 save_file() 」では、次の様にしてアップロード対象となるファイル名の入力チェックを行います。
if (!$filename) {
print $q->p('You must enter a filename before you can upload it');
return;
}
ここでは、予めメソッド「 upload() 」でスカラ変数「 $filename 」に格納しておいた、ファイルハンドルの存在を確認しています。
メソッド upload() は、メソッド「 filefield() 」のパラメータ「 -name 」の値 ( つまりファイル名 ) を元にしてファイルハンドルを作成します。
ですから、スカラ変数 $filename をチェックして、偽 ( 空, undef 等 ) と判定された場合は、ファイル名が適切に入力されていないことになります。
そのため、if 文の条件式では、論理否定演算子「 ! 」( (0x0d) ) を利用して、「 条件が 偽 になった場合 」の処理を記述してあります。
ちなみに、if 文と否定演算子の組み合わせは、「 unless 」制御構造で置き換えることができます。unless 文は (0x80) で確認しました。
入力がなかった場合は、次のメッセージを出力してから、「 return 」演算子を使って処理のフローをメインルーチンに戻しています。
You must enter a filename before you can upload it
( あなたは入力しなければいけません ファイル名を アップロードする前に)
return 演算子は (0x36) で確認しました。
ファイル名の文字列チェック
ファイル名の文字列チェックは、つまりデータの汚染 ( taint ) チェックを意味します。今回の例では、正規表現を利用して「 許可する文字以外はすべて不許可とする 」様に記述してあります。
僕は素人なので、「 不許可にすべき文字 」をリストすることに注力するところでしたが、考えてみれば、「 許可すべき文字 」を指定する方が労力が少なくて済みます。
ユーザには多少の不便を強いることになりますが、安全と自由はトレードオフにあるということで理解します。
if ($filename =~ /^([-\@:\/\\\w.]+)$/) {
$untainted_filename = $1;
} else {
die <<"EOT";
Unsupported characters in the filename "$filename".
Your filename may only contain alphabetic characters and numbers,
and the characters '_', '-', '\@', '/', '\\' and '.'
EOT
}
この例で許可しているファイル名は「 /^([-\@:\/\\\w.])+$/ 」のパターンで構成された文字列です。
0x119 -> 0x11a へ
次回は、「 許可されたファイル名 」を表す正規表現の意味を確認します。
参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。
目次 - Perl Index
Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)