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();
4

3 回答 3

4

假设一个 HTTP 请求是这样的:

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

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

$cgi->param()另一方面,假设一个没有参数的列表上下文,将返回一个URL 未转义的CGI 参数名称列表,在这种情况下和.foobar

(请注意,$cgi->pre(...)不会对它的参数进行 HTML 转义,因此$ENV{QUERY_STRING}可能会通过一点跨站点脚本注入来危及您的 cgi。)

于 2010-01-29T19:53:47.480 回答
1

CGI 对象上的param方法返回所有查询参数的列表,包括 GET 和 POST 参数。除非您传入一个参数,在这种情况下,它会查找具有该名称的参数并返回该值。

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

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

param.

于 2010-01-29T19:40:49.877 回答
-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由 Web 服务器设置,它只是来自 uri 的查询字符串:您可以在此处阅读有关它的更多信息

于 2010-01-29T19:42:26.207 回答