2010-01-29 78 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.改用现代和干净的网络引擎,例如[舞者](http://www.perldancer.org/)或[Mojolicious](http://mojolicious.org/)。 – dolmen 2012-08-31 10:21:30

回答

4

假设这样的HTTP请求:

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

当在具有常规CGI接口的网络服务器下运行时,环境变量QUERY_STRING将为foo=bar&baz=buz。该环境变量不会被URL未转义。与$cgi->pre(...)打印便索性围成<pre></pre>标签(或单个<pre />标签的环境变量,如果该值或者被强制转换为空字符串。

$cgi->param(),在另一方面,假设不带参数列表环境,将返回一个列表网址转义 CGI参数名称,在这种情况下foobar

(请注意,$cgi->pre(...) HTML-逃脱它的参数,所以$ENV{QUERY_STRING}可能只是危及你的CG我用一点点跨站脚本注入。)

+0

真的很好解释,thx! – CatholicEvangelist 2010-01-29 20:08:00

1

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

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

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

Hereparam的文档。

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

相关问题