1

perl cgiスクリプトの場合、これら2つの違いは(技術的に)何ですか?

#!/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インターフェイスを備えたWebサーバーで実行する場合、環境変数QUERY_STRINGはになりますfoo=bar&baz=buz。環境変数はURLエスケープされません。で印刷すると$cgi->pre(...)、env varがタグ(または値が空の文字列であるか強制されている場合は<pre></pre>単一のタグ)で囲まれます。<pre />

$cgi->param()一方、引数のないリストコンテキストを想定すると、URLでエスケープされていないCGIパラメータ名のリストが返されます。この場合はとです。foobar

(これはその引数をHTMLエスケープしないので、$cgi->pre(...)クロスサイト$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_STRINGWebサーバーによって設定されます。これはURIからのクエリ文字列です。詳細についてはこちらをご覧ください。

于 2010-01-29T19:42:26.207 に答える