pre($ ENV {'QUERY_STRING})和($ cgi-> param())有什么区别?

时间:2010-01-29 19:37:07

标签: perl cgi environment-variables params

对于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 个答案:

答案 0 :(得分:4)

假设这样的HTTP请求:

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

在具有传统CGI接口的Web服务器下运行时,环境变量QUERY_STRING将为foo=bar&baz=buz。环境变量不会被URL转义。使用$cgi->pre(...)进行打印只会将env变量用<pre></pre>标记(或单个<pre />标记括起来,如果值是或被强制转换为空字符串。

另一方面,

$cgi->param()并假设没有参数的列表上下文,将返回 URL -unescaped CGI参数名称的列表,这种情况foobar

(请注意,$cgi->pre(...) HTML-escape其参数,因此$ENV{QUERY_STRING}可能会通过一点点跨站点脚本注入来危害您的cgi。)

答案 1 :(得分:1)

CGI对象上的param方法返回所有查询参数的列表,包括GET和POST参数。除非传入参数,否则它会查找具有该名称的参数并返回该值。

QUERY_STRING环境变量包含未解析的查询字符串。

如果您尝试过有问题的代码,这将是非常明显的。

Hereparam的文档。

答案 2 :(得分:-1)

根据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的查询字符串:you can read more about it here