perl cgi распаковать загруженный файл

Я работаю над веб-сервером, где пользователь может загрузить zip-файл. После загрузки он должен разархивировать файл. Я попробовал распаковать системную команду, а также модуль Archive::Extract. Я все еще получаю сообщение об ошибке:

Insecure dependency in eval while running with -T switch at /usr/lib/perl5/5.10.0/Module/Load/Conditional.pm line 332, <GEN3> line 34

Пожалуйста помоги.


person amit    schedule 14.07.2011    source источник


Ответы (2)


Я думаю, вы делаете что-то вроде

system "unzip $value_from_browser";

так что все дело в приглашении для инъекции шелл-кода (имя файла в браузере "bla.zip; rm -fr *")

Используйте синтаксис с несколькими аргументами, который позволяет избежать оболочки:

system 'unzip', $value_from_browser;
person Daniel Pfeiffer    schedule 14.07.2011

Более безопасным способом может быть использование Archive::zip, вот часть моего рабочего кода, он должен дать вам представление о том, как это сделать. Модуль Archive::zip тоже содержит некоторую информацию.

sub unpack_zipfiles
{
my $zipfile = shift;  # Name of uploaded zip file
my $zip = Archive::Zip->new();
my $status = $zip->read($zipfile);
if ($status == AZ_OK )
    {
    my @members = $zip->memberNames();
    my $n = 1;
    foreach my $f (@members)
        {
        my @f2 = split(/\//,$f);
# Part 1 - get a filename, and save the file
        my $zf = getNextFile($f2[$#f2]);
        my $unzipped = qq{$unpack_dir/$zf};
        $zip->extractMemberWithoutPaths($f,$unzipped);
# Part 2 - check if it's new or the same, and adjust the filename if necessary
        $zf = check_or_revert($unpack_dir,$zf,$f2[$#f2]);
        $n++;
        push @msgs,qq{Unzipped file: $zf};
# Add file to list of unpacked file (for diagnostic purposes)
        push @{$data{unpacked}},$unzipped;
# Unzipped files are plonked back in the file queue, because there is a loop that deals with them.
        push @{$data{fileq}},$unzipped;
        }
    }
else
    {
    die "Error: $zipfile is not a valid zip file, Zip status=$status";
    }
}
person Mikkel    schedule 03.10.2012