WebServer SS01 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