CGI-Scripten (und perl
)
Idee und Ablauf
Statt eine formatierte Email zu erzeugen, schickt man die in
einer
form
erfassten Datein einfach als Parameter
an ein Script, dessen Position als URL nagegeben ist. Das
Script führt dann irgendwelche Aktionen aus, und seine Ausgabe
wird als Ergebnis an den Browser zurückgeschickt. Auf die
"schöne" Emailformatierung sollte man verzichten, denn das
unlesbare Format ist das
Common
Gateway
Interface Format.
(s.a.
selfhtml)
Eine beleibte Variante ist, nicht extra eine
Aufruf-Seite zu erzeugen, sondern ein Script zu verwenden, das
beim Aufruf ohne Parameter die initiale Seite mit dem Formular
liefert. Man spart so eine URL.
Mit den Angaben
<form action="/htbin/VereinsDaten-1.2" method="post">
bekommt das Script, wie in der Mail, die Parameterzeile
ID=1&vorname=Dietmar&name=Lammers&email=lammers%40math.uni-muenster.de
Die einzelnen Name/Wert-Paare sind durch &
getrennt, und Sonderzeichen durch %, gefolgt von ihrer
hexadezimalen Codierung gemäß Mime-Typ
application/x-www-form-urlencoded
.
(Um sicherzugehen, das der Browser das richtige Format schickt, kann man der
form
-Anweisung übrigens auch übrigens auch die Spezifikation
enctype="application/x-www-form-urlencoded"
mitgeben.)
Die Methode, wie das Script die Daten bekommt, wird
durch method=
spezifiziet. Möglich sind
get
und post
, post
ist
sicherer und sollte deswegen immer verwendet werden.
Perl-Fragment zum parsen von CGI-Parametern gleich welcher Art
(sogar Angabe einr Parameterzeile als Aufrufargument ist zum testen
möglich), das die Werte in ein assoziatives Array $form{Name}=Wert
packt. Aufruf mit "getCGI()":
sub translateCGI {
# ersetzte dumme CGI-Setungen
local ($ret) = @_;
$ret =~ s/\+/ /g;
$ret =~ s/%([0-9a-fA-F]{2})/pack("c",hex($1))/ge; # sollte auch gehen ...
return $ret;
}
sub parseQuery {
# packe die Parameter und ihre Werte in assoziatives array
local($pair,$name,$val,%form);
foreach $pair ( split('&',$query) ) {
($name,$val) = split('=',$pair);
$form{$name} = translateCGI($val);
}
return %form;
}
sub getCGI {
# CGI-parameter holen und aufbereiten
%form = ();
if ( $ENV{"REQUEST_METHOD"} eq "GET" ) {
$query = $ENV{"QUERY_STRING"};
} elsif ( $ENV{"REQUEST_METHOD"} eq "POST" ) {
read(STDIN,$query,$ENV{"CONTENT_LENGTH"});
}
else {
# direkter Aufruf, praktisch für Testzwecke, auch möglich ...
$query = join('&',@ARGV);
$query =~ s/= *&/=&/g; # leere Felder ganz löschen
}
chomp($query); # ggf. letztes 'Return' löschen ...
%form = parseQuery($query);
}
Die URL zum Script: Direktiven, Scriptenverzeichnis
Sicherheit / zu bedenken
[Inhalt]
[Demo-Aufgabe 2]
[Demo-Aufgabe 3]
[Kapitel php]
Dietmar Lammers, Frank Wübbeling
Last modified: Tue Mar 27 08:38:17 MET DST 2001