2012-10-08 10 views
0

해당 스크립트의 출력이 포함 된 파일을 다운로드하려고하는 PERL 스크립트가 아래에 있습니다.PERL 스크립트를 통해 파일 다운로드

C에서 정의되지 않은 값에 방법 "헤더"를 호출 할 수 없습니다 :

나는 말한다 오류에 직면 /Apache24/cgi-bin/trim.pl을

그러나 내 출력 파일은 올바른 대상에 올바르게 기록됩니다. 코드 수정과 출력 파일 다운로드를 도와주세요. 대신

print $cgi->header(

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; 

답변

0

당신은 아마이 오류를 잡았어야 use strict를 사용

print $q->header(

을 의미한다.

3

strict으로 컴파일되지 않으며 strict을 사용하고 있기 때문에 실행 한 코드가 아닌 것 같습니다. $cgi 개체는 정의 된 적이 없으므로 컴파일 할 때 스크립트를 중지합니다. 이 줄은 :

print $cgi->header(

아마 당신은 또한

-attachment => '$out_file'); 

attachment PARAM 변수 $out_file의 값을, 그것은 것입니다 포함되지 않습니다 것을 의미합니다 것을 알아야한다

print $q->header(

해야한다 변수의 리터럴 이름을 포함합니다. 변수의 값을 포함 시키려면 따옴표를 제거하거나 큰 따옴표를 사용해야합니다.

더 중요한 것은 스크립트가 매우 안전하지 않다는 것을 알아야합니다. 확인하지 않고 cgi 객체의 값을 직접 사용하고 있습니다. open 문과 system 문은 시스템에서 임의의 명령을 실행하도록 쉽게 조작 할 수 있습니다. 예를 들어 :

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

당신은 documentation on security 읽고 싶은, 그리고 아마도 taint mode (-T 스위치)를 사용할 수 있습니다.

+0

다음과 같이 스크립트를 수정했습니다. PERL을 처음 접했을 때 나는 문서 보안 개념에 대해 잘 알지 못합니다. open (DOWNLOADFILE, "<$ out_file") 또는 죽는 "$!"; 인쇄 $ q-> 헤더 ( 유형 => '응용 프로그램/옥텟 스트림' -attachment => "$ out_file"); 닫기 DOWNLOADFILE; 이번에는 스크립트가 성공적으로 실행되지만 out_file을 다운로드 할 수 없습니다. 제발 도와주세요. – Vijay

관련 문제