3

HTMLフォームからの入力をサニタイズする必要があることは理解していますが、最近のモジュールでファイルアップロードフィールドをサニタイズすると、ファイルのアップロードが失敗し始めました。すべてのフォーム入力をサニタイズすることが重要ですよね?特別なファイルアップロードフィールドでさえ?

私のフォーム出力コードは次のようになります。

use CGI;
my $cgi = new CGI;
print $cgi->header();
# ... print some HTML here
print $cgi->start_form();
print $cgi->filefield(-name=>'uploaded_file',
                      -size=>50,
                      -maxlength=>80);
print $cgi->submit(-name=>'continue',
                   -value=>'Continue');
print $cgi->end_form();
# ... print some more HTML here

そして、私のサニタイズコードは次のようになります(実際には上記と同じモジュールの前にあります):

use HTML::Entities
my $OK_CHARS => 'a-zA-Z0-9 .,-_';
foreach my $param_name ( $cgi->param() ) {
    my $original_content = $cgi->param($param_name);
    my $replaced_content = HTML::Entities::decode( $original_content );
    $replaced_content =~ s/[^$OK_CHARS]//go;
    $cgi->param( $param_name, $replaced_content );
}

最近サニタイズコードを追加したところ、ファイルのアップロードが失敗し始めました。ファイルハンドルは、次の行で未定義を返しています。

my $uploadedFilehandle = $cgi->upload('uploaded_file');

それで、私はサニタイズコードで何か間違ったことをしましたか?そのコードスニペットはインターネットのどこかから入手したので、すべてを完全に理解しているわけではありません。'o'正規表現修飾子を見たことがなく、HTML::Entitiesモジュールを使用したこともありません。

4

2 に答える 2

3

エンティティは、ファイルアップロードのコンテンツにエンコードされません。ファイルアップロードのサニタイズは、テキストフィールドのサニタイズと同じではありません。ファイルのアップロードでは、拡張子と、場合によってはフォーマットとエンコーディングをチェックし(特定のデコーダーを使用して開こうとするなど)、ファイルが大きすぎないことを確認します。

コードでは、実際には、ファイルフィールドにアクセスしたときに、ファイルハンドルに対して文字列操作を実行しようとしています。

于 2009-10-05T16:16:47.587 に答える
2

いいえ、すべきではありません。アップロードフィールドの処理方法については、 CGI.pmのドキュメントを参照してください。

安全のため、このupload()関数(バージョン2.47の新機能)を使用してください。アップロードフィールドの名前で呼び出された場合upload()、ファイルハンドルのようなオブジェクトを返すundefか、パラメータが有効なファイルハンドルでない場合を返します。..。

于 2009-10-05T16:39:39.270 に答える