对于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();
答案 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参数名称的列表,这种情况foo
和bar
。
(请注意,$cgi->pre(...)
不 HTML-escape其参数,因此$ENV{QUERY_STRING}
可能会通过一点点跨站点脚本注入来危害您的cgi。)
答案 1 :(得分:1)
CGI对象上的param
方法返回所有查询参数的列表,包括GET和POST参数。除非传入参数,否则它会查找具有该名称的参数并返回该值。
QUERY_STRING
环境变量包含未解析的查询字符串。
如果您尝试过有问题的代码,这将是非常明显的。
Here是param
的文档。
答案 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