Нужно ли дезинфицировать поле ввода загрузки файла в моей форме Perl CGI HTML? - PullRequest
3 голосов
/ 05 октября 2009

Я понимаю необходимость очистки входных данных из 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 );
}

Когда я недавно добавил код очистки, загрузка файла стала невозможной. Файловый дескриптор теперь возвращает неопределенное значение в этой строке:

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

Так я что-то не так сделал в коде очистки? Я получил этот фрагмент кода из Интернета где-то, поэтому я не совсем все понимаю. Я никогда раньше не видел модификатора регулярных выражений 'o' и никогда раньше не использовал модуль HTML :: Entities.

Ответы [ 2 ]

3 голосов
/ 05 октября 2009

Объекты не закодированы в содержимом загружаемых файлов. Очистка загрузки файла - это не то же самое, что очистка текстового поля. При загрузке файла вы проверяете расширение и, возможно, формат и кодировку (пытаясь открыть его с помощью определенного декодера и т. Д.) И убедитесь, что файл не слишком большой.

В вашем коде вы фактически пытаетесь выполнить строковые операции с дескриптором файла при попадании в поле файла.

2 голосов
/ 05 октября 2009

Нет, не стоит. См. CGI.pm docs о том, как обработать поле загрузки:

В целях безопасности используйте функцию upload() (новая в версии 2.47). При вызове с именем поля загрузки upload() возвращает объект, похожий на файловый дескриптор, или undef, если параметр не является допустимым файловым дескриптором. ...

...