0

我正在使用以下代码:

#!/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

4 回答 4

2

查看Data::FormValidator并专门针对上传Data::FormValidator::Constraints::Upload

Data::FormValidator 是处理 CGI 参数验证的方法。您将验证逻辑分离到一个配置文件中,您的自定义验证代码将缩减到几行。

于 2011-03-07T23:47:10.237 回答
0

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)|;
于 2011-03-08T09:01:07.680 回答
-1

查看 File::MimeInfo,参见: https ://metacpan.org/pod/File::MimeInfo

于 2011-03-07T21:53:13.123 回答
-1

在测试无效字符的部分之后,您可以将 $filename 的后缀与文件扩展名进行比较。当然,这样做的问题是文件的实际内容可能不匹配(它们通常会,但你不能总是依赖这个)......

if ($filename =~ /.(jpe?g|gif|png|pdf)$/) { # --- 检查 .jpg、.jpeg、.gif、.png 或 .pdf
  # --- 支持的文件type
} else {
  # --- 不支持的文件类型
}

如果您需要根据检测到的 MIME 类型的文件内容实际比较类型,那么这将需要更多的处理能力(Apache HTTPd 提供了一个用于检测 MIME 类型的模块,这可能很有用,但您可能还必须升级到 modperl_2 和使用 libapreq2 访问此 API)。

然而,对于大多数目的,一个简单的文件扩展测试应该是可以的。

于 2011-03-08T01:06:12.713 回答