Функция cgi param () не работает - PullRequest
1 голос
/ 08 января 2012

Я столкнулся с проблемой с моим Perl-скриптом, которая просто не прошла.Как новичок, я ценю, если кто-нибудь может объяснить это для меня.Как упоминал Линкольн, param () прост в использовании, но на самом деле он сложен.Я прочитал документ cgi и другие примеры, но не смог выяснить, почему этот не работает, который я скопировал для проверки для других.
Я считаю, что мои apache, perl и CGI.pm установлены правильно и хорошо работают с другимипримеры, но не этот.
Большое спасибо!

====================================================

  1  #!/usr/bin/perl -wT

  3  use strict;
  4  use CGI qw(:standard);

  6  my $q = CGI->new;

  8  my $filename = $q->param("name");
    #print $filename, "\n";
  10  my $contenttype = $q->uploadInfo($filename)->{'Content-Type'};

  12  print header;
  13  print start_html;
  14  print "Type is $contenttype<P>";
  15  print end_html;

=================================================== ------------- Сообщение об ошибке ---------------------------------------------

error] [client 127.0.0.1] Use of uninitialized value in hash element at (eval 3) line 3.
[error] [client 127.0.0.1] Can't use an undefined value as a HASH reference at /usr/lib/cgi-bin/Steve/Listing4-1-upload-file.cgi line 10.
[error] [client 127.0.0.1] malformed header from script. Bad header=tomato: Listing4-1-upload-file.cgi

Ответы [ 2 ]

2 голосов
/ 08 января 2012

В первой строке вашего скрипта вы включаете режим Taint для perl (-T switch). Это хорошо. Но это приведет к тому, что любой контент вне скрипта, включая параметры вашего скрипта CGI, будет испорчен. Загрязненное содержимое не может быть использовано при вызовах определенных системных вызовов - см. Man perlsec. Перед использованием этого контента вы должны удалить данные.

Вероятно, именно здесь возникают проблемы, поскольку переменная $filename испорчена, сохранение загруженного содержимого не будет выполнено, и поэтому $q->uploadInfo( $filename ) не вернет хэш-ссылку. Я бы предложил как минимум два изменения:

  1. После получения $ filename отмените его содержимое с помощью регулярного выражения
  2. После вызова uploadInfo проверьте успешность операции, прежде чем продолжить.

Надеюсь, это поможет.

1 голос
/ 08 января 2012

Вы получите сообщение об ошибке, если не проверите, действительно ли у вас есть файл, опубликованный в вашем скрипте. Если вы собираетесь использовать html для отправки формы, это означает, что вам нужен элемент формы, такой как

<input type="file" name="name" />

Попробуйте вместо этого пример. Дополнительные операторы if проверяют файл, чтобы предотвратить обращение к неверной загрузке. Мы также представляем простое для тестирования случая загрузки.

my $filename = $q->param("name");
my $contenttype = '';
$contenttype = $q->uploadInfo($filename)->{'Content-Type'} if $filename;

print header;
print start_html;
print '
<FORM ENCTYPE="multipart/form-data" ACTION="/Listing4-1-upload-file.cgi" METHOD="POST">
Please select a file to upload: <BR/> 
<INPUT TYPE="FILE" NAME="name" />
<INPUT TYPE="submit">
</FORM>';
print "<p>file: $filename </p>" if $filename;
print "<p>Content-Type: $contenttype </p>" if $contenttype;
print end_html;
...