blog20100901

2013/08/20 - プログラミング言語 Perl にまつわる etc. - Perl monger
参考 : perldoc, perldoc.jp, search.cpan.org, perldoc.perl.org ...
「 初めての Perl 第 6 版 」(オライリー・ジャパン発行 ISBN978-4-87311-567-2) 」
「 続・初めての Perl 改訂版 」(オライリー・ジャパン発行 ISBN4-87311-305-9) 」
「 Effective Perl 第 2 版 」(翔泳社発行 ISBN978-4-7981-3981-4) 」 ... etc,.

Perl Perl_2

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

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)の記事
 Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228) (2023-10-11 23:49)
 Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227) (2023-05-26 15:41)
 Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226) (2023-05-19 17:05)
 Perl mp2 翻訳 テンプレートシステムの選択 (d225) (2022-08-15 22:23)
 Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224) (2022-06-15 20:43)
 Perl mp2 翻訳 チュートリアル (d223) (2022-06-15 20:42)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

Llama
リャマ
TI-DA
てぃーだブログ
プロフィール
セラ (perlackline)
セラ (perlackline)
QRコード
QRCODE
オーナーへメッセージ

PAGE TOP ▲