Как я могу отфильтровать загрузку файла по типу с помощью Perl (например, .png, .bmp, .jpg) - PullRequest
0 голосов
/ 08 марта 2011

Я использую следующий код:

#!/usr/bin/perl -wT  

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

my $query = new CGI;  
my $filename = $query->param("photo");  
my $user_username = $query->param("text_value");  

$CGI::POST_MAX = 1024 * 5000;  
my $safe_filename_characters = "a-zA-Z0-9_.-";  
my $upload_dir = "/" . $user_username;  

if ( !$filename )  
{  
 print $query->header ( );  
 print "There was a problem uploading your photo (try a smaller file).";  
 exit;  
}  

my ( $name, $path, $extension ) = fileparse ( $filename, '\..*' );  
$filename = "user_pro_pic" . ".png";  
$filename =~ tr/ /_/;  
$filename =~ s/[^$safe_filename_characters]//g;  

if ( $filename =~ /^([$safe_filename_characters]+)$/ )  
{  
 $filename = $1;  
}  
else  
{  
 die "Filename contains invalid characters";  
}  

my $upload_filehandle = $query->upload("photo");  

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

while ( <$upload_filehandle> )  
{  
 print UPLOADFILE;  
}  

close UPLOADFILE;  

print $query->header ( );   
print "$user_username";
print "<script> location.href='http://google.com/' </script>";

Ответы [ 4 ]

2 голосов
/ 08 марта 2011

Извлечение Данные :: FormValidator и для загрузки специально Данные :: FormValidator :: Ограничения :: Загрузить .

Data :: FormValidator - это способ обработки проверки параметров CGI. Вы разделите свою логику проверки в профиль, и ваш собственный код проверки сократится до нескольких строк.

0 голосов
/ 08 марта 2011

File :: LibMagic - лучший детектор. Непроверенные:

use File::LibMagic;
my $flm = File::LibMagic->new;
…
my $mime_type = $flm->checktype_filename($filename);
die 'Type not accepted.' unless $mime_type =~ m|image/(?:png|jpeg)|;
0 голосов
/ 08 марта 2011

После раздела, где вы проверяете наличие недопустимых символов, вы можете сравнить суффикс $ filename для расширения файла.Конечно, проблема в том, что фактическое содержимое файла может не совпадать (обычно это будет, но вы не всегда можете зависеть от этого) ...

if ($ filename = ~ /.(jpe? g | gif | png | pdf) $ /) {# --- Проверить .jpg, .jpeg, .gif, .png или .pdf
# --- Поддерживаемый тип файла
}else {
# --- Неподдерживаемый тип файла
}

Если вам нужно действительно сравнить тип на основе содержимого файла, определенного типом MIME, то это потребует большей вычислительной мощности (Apache HTTPdпредоставляет модуль для обнаружения типов MIME, который может быть полезен, но вам также может потребоваться обновить его до modperl_2 и использовать libapreq2 для доступа к этому API).

Однако в большинстве случаев простой тест расширения файла должен подойти.

0 голосов
/ 08 марта 2011

Проверить файл :: MimeInfo, см .: https://metacpan.org/pod/File::MimeInfo

...