0

そのスクリプトの出力を含むファイルをダウンロードしようとする以下の PERL スクリプトがあります。

次のようなエラーが表示されます。

C:/Apache24/cgi-bin/trim.pl の未定義の値に対してメソッド「ヘッダー」を呼び出せません

ただし、出力ファイルは適切な宛先に適切に書き込まれます。コードの修正と出力ファイルのダウンロードを手伝ってください。

use strict;
use CGI;
use CGI::Carp qw ( fatalsToBrowser );
use File::Basename;

my $q            = new CGI;
my $upload_dir   = "C:/Apache24/htdocs/files" ;
my ($bytesread, $buffer);
my $numbytes     = 1024;
my $trim_out_dir = "C:/Users/Admin/Desktop/vijay/Metagenomics/NGSQCToolkit_v2.3/CGI_Out";
my $out_file     = "$trim_out_dir/trimmed.fasta";
my $safe_filename_characters = "a-zA-Z0-9_.-";

$q->cgi_error and error( $q, "Error transferring file: " . $q->cgi_error );

my $file         = $q->param( "seq" )     || error( $q, "No file received." );
my $length       = $q->param( "len");
my $quality      = $q->param( "qual");

open ( UPLOADFILE, ">$upload_dir/$file" ) or die "$!";

while ($bytesread = read($file, $buffer, $numbytes)) { 
    print UPLOADFILE $buffer; 
} 

close UPLOADFILE;
system("Reads.pl -i $upload_dir/$file -n $length -o $out_file");
open ( DOWNLOADFILE, "<$out_file" ) or die "$!";

print $cgi->header(
    -type       => 'application/octet-stream'
    -attachment => '$out_file');

close DOWNLOADFILE;
4

2 に答える 2

3

これは ではコンパイルできませんstrict。また、 を使用しているためstrict、これが実行したコードである可能性は低いと思われます。オブジェクト$cgiが定義されていないため、コンパイル時にスクリプトが停止します。この行:

print $cgi->header(

おそらくあるはずです

print $q->header(

ということも知っておくべきです

-attachment => '$out_file');

attachmentparam には変数の値が含まれず、変数$out_fileのリテラル名が含まれることを意味します。変数の値を含める場合は、引用符を削除するか、二重引用符を使用する必要があります。

さらに重要なことは、スクリプトが非常に安全でないことも知っておく必要があります。値を検証せずに cgi オブジェクトから直接使用しています。openステートメントとステートメントの両方systemを簡単に操作して、システム上で任意のコマンドを実行できます。例えば:

$out_file = "foo; rm -rf /";
system("Reads.pl -i $upload_dir/$file -n $length -o $out_file");

security に関するドキュメントを読んで、汚染モード( -Tswitch )を使用することをお勧めします。

于 2012-10-08T09:21:41.270 に答える
0

それ以外の

print $cgi->header(

あなたはおそらく意味します

print $q->header(

を使用use strictすると、このエラーが発生するはずです。

于 2012-10-08T09:21:02.783 に答える