2009-10-05 4 views
3

HTML 양식의 입력을 위생해야 할 필요성을 알고 있지만, 최근 모듈에서 파일 업로드 필드를 삭제할 때 파일 업로드가 실패하기 시작했습니다. 모든 양식 입력을 위생 처리하는 것이 중요합니다. 특별한 파일 업로드 필드조차도?Perl CGI 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); 
} 

I 추가 최근 sanitization 코드가 파일 업로드를 시작하지 못했습니다. 파일 핸들은 다음 줄에서 정의되지 않은 파일을 반환합니다.

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

그래서 위생 처리 코드에 문제가 있습니까? 인터넷에서 코드 스 니펫을 얻었으므로 완전히 이해하지 못합니다. 전에 'o'정규식 수정자를 본 적이 없으며 HTML :: Entities 모듈을 사용하지도 않았습니다.

답변

3

엔티티는 파일 업로드 콘텐츠에 인코딩되지 않습니다. 파일 업로드를 살균하는 것은 텍스트 필드를 살균하는 것과 같지 않습니다. 파일 업로드를 통해 확장자와 형식 및 인코딩 (특정 디코더 등을 사용하여 파일을 열려고 시도)을 검사하고 파일이 지나치게 크지 않은지 확인합니다.

코드에서 파일 필드를 눌렀을 때 파일 핸들에서 문자열 연산을 실제로 시도하고 있습니다.

+0

param ('uploaded_file')이 파일 핸들을 반환했다는 것을 실제로 깨닫지는 못했습니다. 업로드 ('uploaded_file')가 파일 핸들을 반환했다는 것을 알고있었습니다. 내가 발견 한 모든 위생 처리 자습서는이 작은 문제를 언급하지 못했습니다. –

+0

@ Kurt : 항상 파일 핸들이있는 것은 아닙니다. CGI.pm : 양식을 처리 할 때 param()을 호출하여 입력 된 파일 이름을 검색 할 수 있습니다. $ filename = $ query-> param ('uploaded_file'); 다른 브라우저는 이름이 인 경우 약간 다른 결과를 반환합니다. 일부 브라우저는 파일 이름 만 반환합니다. 기타 파일의 전체 경로를 반환합니다 ... 파일 이름은 파일 핸들이기도합니다. upload() 메소드를 사용하는 것이 더 쉽지만 동의하지만 문자열을 처리 할 수 ​​있어야합니다. – jimtut

+0

설명 주셔서 감사합니다. 이미 코드의 다른 부분에서 업로드 된 파일이 내가 예상 한 올바른 유형인지 확인하고 있으므로 위생 루틴에서 업로드 필드의 삭제를 건너 뛸 것입니다. –

2

아니요, 안됩니다. 업로드 필드를 처리하는 방법에 CGI.pm docs를 참조하십시오

는 안전을 위해, (버전 2.47의 새로운)를 upload() 기능을 사용합니다. 업로드 필드의 이름으로 호출하면 upload()은 파일 핸들과 비슷한 객체를 반환하거나 매개 변수가 유효한 파일 핸들이 아니면 undef을 반환합니다. ...