1

私の perl スクリプトで問題が発生しましたが、それはうまくいきませんでした。初心者なので、どなたか教えていただけるとありがたいです。リンカーンが述べたように、param() は簡単に使用できますが、実際には複雑です。私は cgi ドキュメントと他の例を読みましたが、これが機能しない理由を理解できませんでした。テスト用に他のドキュメントからコピーしました。
私のApache、Perl、およびCGI.pmは正しくインストールされ、他の例ではうまく動作すると思いますが、この例ではうまくいきません。
どうもありがとう!

====================================================

  1  #!/usr/bin/perl -wT

  3  use strict;
  4  use CGI qw(:standard);

  6  my $q = CGI->new;

  8  my $filename = $q->param("name");
    #print $filename, "\n";
  10  my $contenttype = $q->uploadInfo($filename)->{'Content-Type'};

  12  print header;
  13  print start_html;
  14  print "Type is $contenttype<P>";
  15  print end_html;

================================================== == -------------エラーメッセージ--------------------------------- ------------

error] [client 127.0.0.1] Use of uninitialized value in hash element at (eval 3) line 3.
[error] [client 127.0.0.1] Can't use an undefined value as a HASH reference at /usr/lib/cgi-bin/Steve/Listing4-1-upload-file.cgi line 10.
[error] [client 127.0.0.1] malformed header from script. Bad header=tomato: Listing4-1-upload-file.cgi
4

2 に答える 2

2

スクリプトの最初の行で、perl のテイント モードを有効にします (-Tスイッチ)。これはいい。しかし、CGI スクリプトへのパラメーターを含む、スクリプトの外部からのコンテンツが汚染される原因となります。汚染されたコンテンツは、特定のシステム コールの呼び出しでは使用できません - man perlsec を参照してください。このコンテンツを使用する前に、データの汚染を取り除く必要があります。

$filename変数が汚染されているため、アップロードされたコンテンツの保存が行われ$q->uploadInfo( $filename )ず、ハッシュリファレンスが返されないため、おそらくこれが問題の原因です。少なくとも 2 つの変更を提案します。

  1. $filename を取得した後、正規表現を使用してその内容を untaint します
  2. uploadInfo を呼び出した後、続行する前に操作が成功したことを確認します。

これが役立つことを願っています。

于 2012-01-08T12:57:58.013 に答える
1

実際にスクリプトに投稿されたファイルがあることを確認しないと、エラーが発生します。html を使用してフォーム送信を生成することが予想される場合は、次のようなフォーム要素が必要であることを意味します。

<input type="file" name="name" />

代わりにこの例を試してください。余分なifステートメントはファイルをチェックして、無効なアップロードの参照を防ぎます。また、アップロード ケースをテストするための簡単な for も示します。

my $filename = $q->param("name");
my $contenttype = '';
$contenttype = $q->uploadInfo($filename)->{'Content-Type'} if $filename;

print header;
print start_html;
print '
<FORM ENCTYPE="multipart/form-data" ACTION="/Listing4-1-upload-file.cgi" METHOD="POST">
Please select a file to upload: <BR/> 
<INPUT TYPE="FILE" NAME="name" />
<INPUT TYPE="submit">
</FORM>';
print "<p>file: $filename </p>" if $filename;
print "<p>Content-Type: $contenttype </p>" if $contenttype;
print end_html;
于 2012-01-08T04:43:17.863 に答える