В чем разница между pre ($ ENV {'QUERY_STRING}) и ($ cgi-> param ())? - PullRequest
1 голос
/ 29 января 2010

для сценария perl cgi, в чем разница (технически) между этими двумя?

#!/usr/bin/perl 
use CGI; 
$cgi = new CGI; 
print $cgi->header(),
$cgi->start_html(),
$cgi->pre($cgi->param()), 
$cgi->end_html();

и

#!/usr/bin/perl 
use CGI; 
$cgi = new CGI; 
print $cgi->header(),
$cgi->start_html(), 
$cgi->pre($ENV{'QUERY_STRING'}), 
$cgi->end_html();

Ответы [ 3 ]

4 голосов
/ 29 января 2010

Предположим, HTTP-запрос выглядит так:

GET my.cgi?foo=bar&baz=buz

При запуске под веб-сервером с обычным CGI-интерфейсом переменная среды QUERY_STRING будет foo=bar&baz=buz. Переменная окружения не будет удалена из URL. Печать с $cgi->pre(...) будет просто заключать в env var теги (или один тег <pre />, если значение приведено или приведено к пустой строке.

$cgi->param(), с другой стороны, и при условии, что контекст списка без аргументов вернет список из URL-неэкранированный Имена параметров CGI, в данном случае foo и bar.

(Обратите внимание, что $cgi->pre(...) не не HTML-экранирует свой аргумент, поэтому $ENV{QUERY_STRING} может просто поставить под угрозу ваш cgi с помощью небольшого внедрения межсайтовых скриптов.)

1 голос
/ 29 января 2010

Метод param объекта CGI возвращает список всех параметров запроса, включая параметры GET и POST. Если вы не передадите аргумент, в этом случае он ищет параметр с таким именем и возвращает значение.

Переменная окружения QUERY_STRING содержит строку необработанного запроса.

Это было бы довольно очевидно, если бы вы попробовали код, о котором идет речь.

Здесь - документация для param.

0 голосов
/ 29 января 2010

По источнику CGI.pm

#### Method: param
# Returns the value(s)of a named parameter.
# If invoked in a list context, returns the
# entire list.  Otherwise returns the first
# member of the list.
# If name is not provided, return a list of all
# the known parameters names available.
# If more than one argument is provided, the
# second and subsequent arguments are used to
# set the value of the parameter.

QUERY_STRING устанавливается веб-сервером, это просто строка запроса из uri: , подробнее об этом можно прочитать здесь

...