2010-01-29 2 views
1

для скрипта 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(); 
+1

Пожалуйста, прекратите использовать грязный старый CGI.pm. Используйте вместо этого современный и чистый веб-движок, такой как [Dancer] (http://www.perldancer.org/) или [Mojolicious] (http://mojolicious.org/). – dolmen

ответ

4

Предположим, запрос HTTP, как это:

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

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

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

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

+0

действительно приятное объяснение, thx! – CatholicEvangelist

1

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

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

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

Here - это документация для param.

-1

Per источник 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 установлен веб-сервер, это просто строка запроса от Ури: you can read more about it here