Quelle est la différence entre la pré ($ ENV { 'QUERY_STRING}) et (cgi $> param ())?
-
24-09-2019 - |
Question
pour un script cgi perl, quelle est la différence (techniquement) entre ces deux?
#!/usr/bin/perl
use CGI;
$cgi = new CGI;
print $cgi->header(),
$cgi->start_html(),
$cgi->pre($cgi->param()),
$cgi->end_html();
et
#!/usr/bin/perl
use CGI;
$cgi = new CGI;
print $cgi->header(),
$cgi->start_html(),
$cgi->pre($ENV{'QUERY_STRING'}),
$cgi->end_html();
La solution
Supposons une requête HTTP comme ceci:
GET my.cgi?foo=bar&baz=buz
Lorsqu'il est exécuté sous un serveur web avec une interface classique de CGI, sera foo=bar&baz=buz
l'environnement QUERY_STRING variable. La variable d'environnement ne sera pas URL-séquence d'échappement. Impression avec $cgi->pre(...)
simplement enferment le var env avec des balises <pre></pre>
(ou une seule étiquette <pre />
si la valeur est ou sous la contrainte à une chaîne vide.
$cgi->param()
, d'autre part, et en supposant un contexte de liste sans arguments, renvoie un de URL-séquence d'échappement noms de paramètres CGI, dans ce cas foo
et bar
.
(Notez que $cgi->pre(...)
ne pas HTML échapper à son argument, si $ENV{QUERY_STRING}
pourrait juste compromettre votre cgi avec une petite injection de script inter-site.)
Autres conseils
La méthode param
sur l'objet CGI retourne une liste de tous les paramètres de la requête, y compris les paramètres GET et POST. À moins que vous passez un argument, auquel cas il recherche un paramètre avec ce nom et renvoie la valeur.
La variable d'environnement QUERY_STRING
contient la chaîne de requête non analysée.
Cela aurait été assez évident si vous aviez essayé le code en question.
Par la source de 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
est définie par le serveur web, il est tout simplement la chaîne de requête des uri: vous pouvez en lire davantage ici