From: Volker Rattel Subject: 2005-11-20 [de.comp.lang.perl.cgi] FAQ Newsgroups: de.comp.lang.perl.cgi Followup-To: poster MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit Posting-frequency: weekly Last-modifed: 2005-11-20 Version: 2.18 URL: http://www.worldmusic.de/perl/dclpc-faq.txt dclpc-faq Häufig gestellte Fragen in de.comp.lang.perl.cgi ###################################################################### INHALTSVERZEICHNIS ###################################################################### Allgemeine Informationen - Worum geht es in de.comp.lang.perl.cgi? - Was sollte man _vor_ dem Posten in de.comp.lang.perl.cgi beachten? - Woher bekommt man die aktuelle Perl-Version? - Wo gibt es Dokumentation über Perl und CGI? - Wo findet man weiterführende Literatur? - Wo findet man Perl-Scripte und Module? - Was für einen Editor gibt es für Perl? Fehlerbehandlung und -vermeidung - Bei der Ausführung meines Scriptes tauchen Fehler auf. - Mein Script läuft nicht bei meinem Provider. - Was hat es mit CHMOD 755 auf sich? - Was bedeuten die Fehlernummern bei einem Servererror? - Was bedeutet ein "Internal Server Error"? Serverfragen - Was ist der Unterschied zwischen einem Win32- und einem UNIX-Server? - Wo finde ich einen Provider für meine CGI-Scripte? - Wie konfiguriere ich den Webserver, um Perl und CGI Scripte ausführen zu können? - Welche Sicherheitsaspekte sollte man beim Einsatz von CGI-Scripten bedenken? - Wie kann man Dateien vor mehrfachen Zugriff schützen? Versenden von Mail - Wie prüfe ich die Echtheit einer E-Mail-Adresse? - Wie versende ich Mail? - Wie versende ich Mail mit Attachments? - Gibt es ein sendmail für Windows? Verschiedene Informationen - Welche Methoden gibt es, um ein Perl- / CGI-Script via HTML aufzurufen? - Wie kann man einen URL von einem Perl-Skript holen lassen? - Wie extrahiert man URLs aus einer HTML-Datei? - Wie generiert man einen gültigen HTML 4.x Header? - Wie kann man die IP-Adresse eines Clients ermitteln? - Wie implementiere ich ein Session-Tracking? Anhang - Kontakt - History - Credits - Autor und Copyright - Disclaimer - Changes ###################################################################### ALLGEMEINE INFORMATIONEN ###################################################################### ---------------------------------------------------------------------- Worum geht es in de.comp.lang.perl.cgi? ---------------------------------------------------------------------- In de.comp.lang.perl.cgi geht es um den Einsatz der Programmiersprache Perl in CGI-Scripten. Aus der Charta: Diese Gruppe dient als Forum für die Erstellung, Installation und Anpassung vorhandener CGI-Programme, die in der Programmiersprache Perl realisiert sind. Komplette Listings sind im Gegensatz zu Programmauszügen (weniger als 75 Zeilen) unerwünscht. Ausdrücklich sei betont, daß sich die Gruppe nicht nur an Unix-Administratoren richtet, auch Benutzer anderer Systeme sind willkommen. Für allgemeine Fragen zu Perl gibt es die Newsgroup news:de.comp.lang.perl.misc Crossposts innerhalb der de.comp.lang.perl.* Gruppen sind unerwünscht. Für Fragen zu Webservern (speziell für den Bereich .htaccess) siehe die Newsgroup news:de.comm.infosystems.www.servers ---------------------------------------------------------------------- Was sollte man _vor_ dem Posten in de.comp.lang.perl.cgi beachten? ---------------------------------------------------------------------- - Genaue Fehlerbeschreibung des Problems angeben Siehe dazu die Checkliste unter http://www.worldmusic.de/perl/checkliste.txt - Die gängigen Usenet-Richtlinien beachten Siehe dazu news:de.newusers.infos - Keine "Ich suche... " Postings nach Standard-Scripten Es gibt genügend Wege selbst nach Scripten zu suchen. - On-Topic bleiben Fragen, die nicht im Zusammenhang mit Perl in CGI-Scripten stehen, sondern Perl im allgemeinen behandeln, gehören nach news:de.comp.lang.perl.misc - RTFM Bevor man postet sollte man wenigstens ein paar Dokumentationen und FAQs gelesen haben. ---------------------------------------------------------------------- Woher bekommt man die aktuelle Perl-Version? ---------------------------------------------------------------------- Die aktuelle Perl-Version lautet 5.8.7. Im Einsatz auf Produktions-Plattformen ist dies auch die stabile und getestete Version. Perl-Versionen für alle Betriebssysteme findet man unter http://www.perl.com/download.csp Das Modul CGI.pm gehört seit der Version 5.004 von Perl zur Standard-Distribution. Die aktuelle Version von CGI.pm findet sich unter http://search.cpan.org/modlist/World_Wide_Web/CGI CGI.pm übernimmt viele Funktionen für das Erstellen und Senden von CGI-Formularen und erleichtert den Umgang mit Standard-Routinen. Für den Bereich der Client-Programmierung und der Erstellung von Web-Applikationen bietet das Modul libwww-perl (auch LWP genannt) eine Fülle von Optionen. Das Modul kann man unter http://search.cpan.org/modlist/World_Wide_Web/LWP herunterladen. Siehe auch: perldoc perlport ---------------------------------------------------------------------- Wo gibt es Dokumentation über Perl und CGI? ---------------------------------------------------------------------- Viele Fragen lassen sich bereits durch das Lesen der hervorragenden Dokumentation lösen, die bei der Distribution von Perl dabei ist. Um auf die Dokumentation zuzugreifen, gibt man in der Kommandozeile seines jeweiligen Betriebssystems folgendes ein: perldoc perltoc Dieser Befehl zeigt einem das Inhaltsverzeichnis der Dokumentation. Mit 'perldoc perlfaq' erhält man das Inhaltsverzeichnis des FAQs. Schließlich läßt sich mit perldoc CGI.pm ein FAQ zum Modul CGI.pm anzeigen. Hilfe zum Programm perldoc kann man mit 'perldoc perldoc' aufrufen. Bei einigen Distributionen findet sich die Hilfe auch im HTML-Format. Für Dokumentation zu CGI-Modulen bieten folgende Quellen die Möglichkeit zur Nachforschung: (deutsch) http://www.oreilly.de/catalog/perlmodger/manpage/cgi.htm http://www.linux-magazin.de/ausgabe/1998/03/CGI/cgi1.html http://www.linux-magazin.de/ausgabe/1998/04/CGI/cgi2.html http://www.linux-magazin.de/ausgabe/1998/05/CGI/cgi3.html http://www.linux-magazin.de/ausgabe/1998/06/CGI/cgi4.html (englisch) http://language.perl.com/CPAN/doc/FAQs/cgi/idiots-guide.html http://www.boutell.com/openfaq/cgi/ http://www.ietf.org/internet-drafts/draft-coar-cgi-v11-03.txt Siehe auch: perldoc perl, perldoc perltoc, perldoc perlfaq ---------------------------------------------------------------------- Wo findet man weiterführende Literatur? ---------------------------------------------------------------------- Es gibt zahllose Bücher zum Thema Perl. Einen Überblick über deutschsprachige Bücher kann man sich in dem Dokument von Jörgen W. Lang verschaffen: http://www.worldmusic.de/perl/perlbuch.txt Ansonsten sollte man sich mal bei - Addison Wesley (http://www.awl.de/) - O'Reilly (http://www.oreilly.de/) umschauen (ohne Anspruch auf Vollständigkeit). Siehe auch: perldoc perlbook, perldoc perlfaq2 ---------------------------------------------------------------------- Wo findet man Perl-Scripte und Module? ---------------------------------------------------------------------- Einsatzbereite Scripte gibt es unter http://www.cgi-resources.com/ Perl-Module werden im CPAN (Comprehensive Perl Archive Network) gesammelt. Zu finden unter http://www.perl.com/CPAN/CPAN.html Dort stehen _zahllose_ Module zum Download bereit. Das CPAN kann auch durchsucht werden: http://search.cpan.org Siehe auch: perldoc perlmod, perldoc perlmodlib, perldoc CPAN ---------------------------------------------------------------------- Was für einen Editor gibt es für Perl? ---------------------------------------------------------------------- Immer wieder taucht die Frage auf, mit welchem Editor man Perl-Scripte schreiben kann. Prinzipiell kann man seine Scripte mit jedem Texteditor schreiben; wer allerdings Syntax-Highlighting und andere Features wünscht, sollte sich mal die folgenden Editoren anschauen. Die Liste erhebt keinen Anspruch auf Vollständigkeit: UNIX und Verwandte - Emacs (http://www.emacs.org/) - XEmacs (http://www.xemacs.org/) - vim (http://www.vim.org/) Windows und Konsorten - Textpad (http://www.textpad.com/) - UltraEdit (http://www.ultraedit.com/) - EditPlus (http://www.editplus.com/) Macintosh - BBedit (Lite) (http://www.barebones.com) - SimpleText (http://www.apple.de) ###################################################################### FEHLERBEHANDLUNG UND -VERMEIDUNG ###################################################################### ---------------------------------------------------------------------- Bei der Ausführung meines Scriptes tauchen Fehler auf. ---------------------------------------------------------------------- Perl bietet bereits eine Reihe von Möglichkeiten, die das Fehleraufspüren erheblich erleichtern. Jedes Programm sollte folgendermaßen beginnen: #!/usr/bin/perl use warnings; use diagnostics; use strict; 'use warnings' schaltet die Fehlermeldungen des Interpreters ein. Durch 'use diagnostics' werden diese Meldungen zudem detailierter. Das 'use strict' sorgt penibel dafür, daß z. B. Variablen korrekt initialisiert werden. Manchmal ist das strict allerdings so ungnädig und bricht das Programm ab, daß man sich unbedingt die zugehörige Dokumentation mit 'perldoc strict' ansehen sollte, um nicht zu verzweifeln. Kann man die Ausführung seines Scripts lediglich via Web beobachten, so sorgt ein use CGI::Carp qw(fatalsToBrowser); dafür, daß alle Fehlermeldungen an den Browser übertragen werden. Mit dem Aufruf 'perl -d mein_prog.pl' schaltet man den internen Debugger ein, der sehr nützliche Fehler-Informationen bereithält. Eine weitere Quelle für verdeckte Fehler sind ungetestete Rückgabewerte von Funktionsaufrufen. Man sollte daher immer testen, ob bspw. die open() Funktion korrekt abgeschlossen wurde: open (my $file, '<', './etc/passwd') or die "Fehler beim Öffnen von /etc/passwd. Grund: $!\n"; Siehe auch: perldoc strict, perldoc CGI::Carp, perldoc -q error ---------------------------------------------------------------------- Mein Script läuft nicht bei meinem Provider. ---------------------------------------------------------------------- Grundsätzlich stellt sich die Frage, ob der Provider überhaupt die Ausführung von CGI-Scripten sowie Perl erlaubt. Das kann nur direkt mit dem jeweiligen Provider geklärt werden. Wenn das geklärt ist, muß das Script noch an die richtige Stelle kopiert werden. Es ist üblich, daß dazu ein spezielles Verzeichnis auf dem Server existiert das cgi-bin heißt. Dorthin muß das Script kopiert werden. Gemeinhin wird das Script mit der Dateiendung .cgi oder .pl versehen. Dies kann jedoch von Provider zu Provider (bzw. Webserver zu Webserver) variieren. Für den Anfang ist man mit der Endung .cgi gut beraten. Nachdem nun das Script an der richtigen Stelle sitzt, muß es noch ausführbar gemacht werden. Generell sollte man sein Script zunächst "offline" testen, damit man sichergehen kann, daß es überhaupt läuft. Ein wichtiger Punkt bei der Übertragung seines Scriptes per FTP ist die Verwendung des ASCII-Modus. Bei WS_FTP kann man diesen am unteren Bildschirmrand einstellen. Hinweis: Bei der Einstellung erkennt WS_FTP anhand der Dateiendung, ob es sich um eine ASCII- oder Binärdatei handelt. Wenn die Endungen .pl bzw. .cgi nicht eingestellt worden sind, überträgt WS_FTP die Dateien binär! ---------------------------------------------------------------------- Was hat es mit CHMOD 755 auf sich? ---------------------------------------------------------------------- Damit ein CGI-Script durch den Webserver ausgeführt werden kann, muß es "weltweite" Ausführrechte besitzen. Mit dem Befehl chmod unter UNIX erreicht man genau dieses. Wer nur Zugang via FTP-Programm hat, kann trotzdem ein chmod durchführen. Programme wie z. B. WS_FTP lassen dies auch zu. Dazu selektiert man die entsprechende Datei und rechtsklickt darauf. Nachdem man den Befehl chmod angewählt hat, erscheint eine ähnliche Maske wie unten abgebildet. Dort müssen folgende Felder selektiert werden: +---------------------------------------------+ | Owner Group Other | | | | [X] Read [X] Read [X] Read | | [X] Write [ ] Write [ ] Write | | [X] Execute [X] Execute [X] Execute | +---------------------------------------------+ Dies entspricht dem Kommandozeilenbefehl chmod 0755 filename Wenn man mit einer Gruppe von Benutzern zu tun hat, bietet sich noch ein chmod 0775 an, was für die Gruppe Schreibrechte bedeutet. Es mag sicherlich noch andere mögliche Kombinationen geben, doch hat sich ein chmod 0755 in der Praxis für den Anfang gut bewährt. :-) Siehe auch: chmod(1), perldoc -f chmod ---------------------------------------------------------------------- Was bedeuten die Fehlernummern bei einem Servererror? ---------------------------------------------------------------------- Bei der Ausführung eines Scriptes erscheint eine Server- bzw. Client-Fehlermeldung. Anhand der Codezahl lassen sich eventuelle Fehler schneller eingrenzen. Weitere Hinweise gibt es unter http://www.ietf.org/rfc/rfc2616.txt http://www.w3.org/Protocols/HTTP/1.0/spec.html#Status-Codes Siehe auch: Dokumentation des jeweiligen Webservers ---------------------------------------------------------------------- Was bedeutet ein "Internal Server Error"? ---------------------------------------------------------------------- Bei dem Versuch ein Script auszuführen, erscheint eine Seite mit einem "Internal Server Error". Grundsätzlich bedeutet dies, daß der Server ein Problem bei der Verarbeitung oder Ausgabe des Scriptes hatte. Dieser Fehler taucht z. B. dann auf, wenn ein Script falsch geschriebene Anweisungen enthält und der Perl-Interpreter die Ausführung abbricht. Detailierte Informationen zur Fehlerursache finden sich in den Logfiles des Webservers -- genauer gesagt in den Error-Logfiles. Falls auf die Log-Dateien nicht zugegriffen werden kann, so können mit Hilfe des folgenden Scriptes nähere Informationen herausgefunden werden. Hinweis: Dies funktioniert nur bei dem Apache Webserver. Einbinden in die .htaccess Datei: ErrorDocument 500 /cgi-bin/internal-error.pl Das Script internal-error.pl sieht folgendermaßen aus: #!/usr/bin/perl -w print "Content-type: text/plain\r\n\r\n"; print "Internal Server Error: $ENV{REDIRECT_ERROR_NOTES}\n"; Beim nächsten Internal Server Error würden dann Informationen zur Fehlerursache ausgegeben werden. Häufige Fehlerursachen sind falsch geschriebene Header am Scriptanfang (Content-type), die den berühmten "Premature end of script headers"-Fehler hervorrufen. Siehe auch: Dokumentation des jeweiligen Webservers ###################################################################### SERVERFRAGEN ###################################################################### ---------------------------------------------------------------------- Was ist der Unterschied zwischen einem Win32- und einem UNIX-Server? ---------------------------------------------------------------------- Grundsätzlich müssen Perl-Scripte auf einem UNIX-Server mit folgender Zeile beginnen: #!/usr/bin/perl Bei einigen UNIXen auch #!/usr/local/bin/perl genauen Aufschluß gibt notfalls der Administrator. Auf Win2000/WinXP Systemen mit Apache muss die Lage des Perl-Interpreters als Windows-Dateipfad angegeben werden. Z. B.: #!c:\perl\perl.exe Zwar wird in Windows eine Systemvariable gesetzt, die mit Dateien der Endung *.pl verknüpft ist, auf obiger Konfiguration führt dies dennoch zu einem Error "Couldn't spawn child process" wenn ein Script via CGI ausgeführt wird. Auf anderen Konfigurationen (mit anderem Webserver als Apache) ist die Angabe des Perlinterpreterpfades nicht nötig (kann aber auch nicht schaden). Unter UNIX spielt die Groß- und Kleinschreibung ein Rolle. Ein use Strict; ist nicht gleich einem use strict; Gerade wer von Win32 auf UNIX umstellt, sollte seine Scripte auf korrekte Schreibweise überprüfen. Ohne auf die Vor- und Nachteile des jeweiligen Betriebssystems einzugehen kann man sagen, daß unter UNIX standardmäßig mehr Tools und Eigenschaften wie sendmail, cron oder File-Locking zur Verfügung stehen, die unter Windows nicht vorhanden sind oder aber nachinstalliert werden müssen. Wer welches Betriebssystem besser findet, ist letzenendes Glaubenssache. Beide eignen sich für die Verwendung von Perl und CGI. Siehe auch: perldoc perlport, perldoc perlwin32 ---------------------------------------------------------------------- Wo finde ich einen Provider für meine CGI-Scripte? ---------------------------------------------------------------------- Eine Suchmaschine zu dieser Thematik ist unter http://www.freewebspace.net/ zu finden. Ein freier Script-Hoster ist bspw. http://www.virtualave.net ---------------------------------------------------------------------- Wie konfiguriere ich den Webserver, um Perl und CGI Scripte ausführen zu können? ---------------------------------------------------------------------- Für Fragen zu Webservern siehe die Newsgroup news:de.comm.infosystems.www.servers Da eine vertiefende Beantwortung dieser Frage an dieser Stelle nicht geleistet werden kann, folgen ein paar grundsätzliche Dinge: - Der Webserver muß installiert und konfiguriert sein - Perl muß installiert sein - Der Webserver muß die Dateiendung .cgi oder .pl mit der Ausführung von Perl verbinden - Gemeinhin wird die Ausführung von CGI-Scripten auf ein Verzeichnis namens 'cgi-bin' begrenzt - Die Scripte müssen ausführbar und via Web aufrufbar sein Zu bemerken bleibt, daß CGI-Scripte generell nicht von einem bestimmten Aufrufpfad ausgehen sollten. Dieses ist im CGI- Standard auch nicht festgelegt. ---------------------------------------------------------------------- Welche Sicherheitsaspekte sollte man beim Einsatz von CGI-Scripten bedenken? ---------------------------------------------------------------------- Mittels einer ausreichend großen Datei ist es möglich, bei einer POST Operation oder eines Datei-Uploads den betreffenden Server lahmzulegen. Dies wird auch als "Denial of Service"-Attacke bezeichnet. Unter der Verwendung von CGI.pm lassen sich präventiv folgende Einstellungen treffen: $CGI::POST_MAX gibt die in Bytes zulässige Größe für POST- Operationen an. $CGI::DISABLE_UPLOADS unterbindet Datei-Uploads vollständig. Beispiel: #/usr/bin/perl -w use strict; use CGI qw/:standard/; $CGI::POST_MAX = 1024 * 100; # maximal 100K Postings $CGI::DISABLE_UPLOADS = 1; # keine Uploads Sicherhaltshalber sollten Speicher, CPU-Zeit und Plattenplatz für CGI-Scripte serverseitig limitiert werden. Desweiteren sollte der Parameter '-T' in Betracht gezogen werden, der Perl veranlaßt im sogenannten taint mode zu starten. In diesem Modus werden spezielle Sicherheitsüberprüfungen durchgeführt. Vielfach befinden sich Scripte aus Matt's Script Archive (MSA) im Einsatz in Produktionsumgebungen. Diese Scripte sind gerade bei unerfahrenen Anwendern sehr beliebt, weil sie sehr schnell zu installieren sind. Leider sind diese Script _äußerst_ unsicher und stellen ein großes Sicherheitsrisiko dar! Unter http://nms-cgi.sourceforge.net/ entsteht ein Projekt, daß sich zum Ziel gesetzt hat, die MSA Scripte durch sicherere Varianten zu ersetzen. Siehe auch: perldoc CGI.pm, perldoc -q cgi, perldoc perlsec ---------------------------------------------------------------------- Wie kann man Dateien vor mehrfachen Zugriff schützen? ---------------------------------------------------------------------- Um Dateien vor gemeinsamen Zugriff zu schützen, kann man ein sogenanntes File-Locking durchführen. Beispiel: #!/usr/bin/perl use warnings; use strict; use Fcntl ':flock'; my $my_file = '/tmp/foo.txt'; open (my $file, '<', $my_file) or die "Kann $my_file nicht öffnen: $!"; flock ($file, LOCK_SH) or die "Kann $my_file nicht sperren: $!"; # Irgend etwas mit my_file anstellen... close ($file) or die "Kann $my_file nicht schließen: $!"; Die Funktion flock() erwartet zum einen das zu sperrende Filehandle und zum anderen eine Zahl, die die Art des zu verwendenden Lockings angibt. Verwendet man das Modul Fcntl, kann man die Zahlen durch unten genannte Platzhalter ersetzen. Die Werte haben folgende Bedeutung: 1 LOCK_SH Shared Lock (für Leseoperationen) 2 LOCK_EX Exclusive Lock (für Schreiboperationen) 4 LOCK_NB Nonblocking Lock (hält die Anwendung nicht an) 8 LOCK_UN Lock auflösen Das Schließen des zuvor gesperrten Filehandles hebt das Lock auf. Hinweis: Betriebssysteme wie Windows (3.11, 95, 98) besitzen kein File-Locking! Grundsätzlich sollte man eine Datei mittels LOCK_SH sperren, wenn man aus ihr nur lesen möchte. Bei Schreiboperationen sollte man das LOCK_EX verwenden. Siehe auch: perldoc -f flock, perldoc -q lock, perlopentut(1), perlfunc(1), open(2), dup(2), fopen(2), fdopen(2) ###################################################################### VERSENDEN VON MAIL ###################################################################### ---------------------------------------------------------------------- Wie prüfe ich die Echtheit einer E-Mail-Adresse? ---------------------------------------------------------------------- Der einzige Weg zur reinen Gewissheit ist dieser: - Du erhältst eine Mail-Adresse, die Du prüfen möchtest - Du schreibst an diese Adresse folgende Nachricht: Hallo, wenn dieser Account echt ist, dann beantworte doch bitte folgende Frage: "Wer hat den 'Herr der Ringe' geschrieben?" - Wenn Du eine Antwort erhältst (und diese J. R. R. Tolkien lautet) dann ist davon auszugehen, daß der Account echt ist. Fazit: Man kann zwar überprüfen, ob die E-Mail-Adresse aus erlaubten Zeichen besteht und es läßt sich auch überprüfen, ob eine Mail an diesen Account bounced, jedoch sagt dies noch nichts über die Echtheit des Accounts aus. Ein gutes Tool zum Überprüfen von Adressen stammt von Tom Christiansen und nennt sich addrcheck. Es findet sich unter http://www.cpan.org/modules/by-module/Proxy/TOMC/scripts/ckaddr.gz Siehe auch: perldoc -q "valid mail" ---------------------------------------------------------------------- Wie versende ich Mail? ---------------------------------------------------------------------- Man kann den MTA (Mail Transport Agent) direkt aufrufen: open(SENDMAIL, '|/usr/lib/sendmail -oi -t -f foo@example.com -odq') or die "Kein fork fuer sendmail: $!\n"; print SENDMAIL <<'EOF'; From: Foo To: Bar Subject: Wichtig! Inhalt der Nachricht, wobei die oben stehende Leerzeile von Bedeutung ist. EOF close(SENDMAIL) or warn "Sendmail nicht korrekt beendet"; Alternativ dazu kann man das CPAN Modul Mail::Mailer benutzen. Wenn die Empfängeradresse aus einer Variablen stammt, so sollte man unbedingt sicherstellen, dass sie keine unerlaubten Zeichen enthält. Siehe auch: perldoc -q "send mail", perldoc Mail::Mailer, perldoc Net::SMTP, sendmail(8) ---------------------------------------------------------------------- Wie versende ich Mail mit Attachments? ---------------------------------------------------------------------- Mit dem CPAN Modul MIME::Lite. Es erlaubt z. B. das Versenden von angehängten Bildern oder multipart messages. Beispiel: #!/usr/bin/perl use warnings; use strict; use MIME::Lite; my $msg = MIME::Lite->new( From => 'foo@example.com', To => 'bar@example.com', Subject => 'Look at this', Type => 'image/gif', Encoding => 'base64', Path => 'foo_and_bar.gif', ); $msg->send(); Siehe auch: perldoc MIME::Lite ---------------------------------------------------------------------- Gibt es ein sendmail für Windows? ---------------------------------------------------------------------- Sendmail ist ein UNIX-Programm und nicht für Windows-Systeme verfügbar. Alternativ dazu kann man das Programm Blat benutzen: http://blat.net/ Desweiteren sollte man die Dokumentation der CPAN Module Mail::Mailer und Net::SMTP lesen. Siehe auch: perldoc -q "send mail", perldoc Mail::Mailer, perldoc Net::SMTP ###################################################################### VERSCHIEDENE INFORMATIONEN ###################################################################### ---------------------------------------------------------------------- Welche Methoden gibt es, um ein Perl- / CGI-Script via HTML aufzurufen? ---------------------------------------------------------------------- Zunächst sollte folgender Sachverhalt Erwähnung finden: CGI ist nicht Perl! Das Common Gateway Interface (CGI) ist lediglich eine Schnittstelle zwischen dem WWW-Server und dem aufgerufenen Programm. CGI-Programme können in beliebigen Programmiersprachen gehalten sein. Perl ist eine davon. Eine ausführliche Beschreibung der CGI-Schnittstelle gibt es unter http://hoohoo.ncsa.uiuc.edu/cgi/interface.html Für einen Aufruf über eine HTML-Seite gibt es grundsätzlich mehrere Wege: (1) GET-Methode Alle übergebenen Parameter werden in der URL kodiert und dem Web-Server übermittelt. Die Parameter können dann aus der Umgebungsvariable QUERY_STRING gelesen werden. Die Variable REQUEST_METHOD wird in diesem Fall auf GET gesetzt. Beispiel: Click Dies erzeugt einen Textlink, der das Script my_script.cgi aufruft. Um dem Script Parameter zu übergeben, können diese angehängt werden. Beispiel: Click Anmerkung: Gemäß HTML 4.0 sollten Parameterverknüpfungen per '&' im HTML-Code durch ein '&' codiert werden. Siehe dazu http://ppewww.ph.gla.ac.uk/~flavell/www/formgetbyurl.html Die Parameter 'id1' und 'id2' lassen sich dann z. B. mit CGI.pm abfragen: #!/usr/bin/perl use warnings; use strict; use CGI; my $query = new CGI; my $para1 = $query->param('id1'); my $para2 = $query->param('id2'); (2) POST-Methode Im Gegensatz zur GET-Methode werden die Daten nicht über die URL kodiert, sondern an den HTTP-Header angehängt. Das hat zur Folge, daß die Parameter nicht in der URL-Zeile des Browsers zu sehen sind. Die Variable REQUEST_METHOD wird auf POST gesetzt und die Länge der Daten steht in CONTENT_LENGTH. Beispiel:
Die Parameter lassen sich mit CGI.pm genauso auslesen wie oben beschrieben. Hinweis: Bei der Verwendung von CGI.pm muß man sich nicht um die verwendete REQUEST_METHOD kümmern; CGI.pm entscheidet selbst und stellt die Parameter in param() zur Verfügung. (3) Server-Side Includes (SSI) SSI sind Tags, die direkt im HTML-Quellcode eingetragen werden. Dadurch wird das Perl-Script beim Laden der Seite ausgeführt und kann somit zum Erzeugen dynamischer Inhalte verwendet werden (z. B. Web-Counter oder Banner). Um via SSI ein Script in eine HTML-Seite einzubinden, kann man folgende Methode benutzen: oder Das Leerzeichen vor dem '-->' ist wichtig! Fehlt es, kommt es zu Fehlermeldungen des Webservers und das Script wird nicht ausgeführt. Weiterhin ist zu beachten, daß der Webserver für den Einsatz von SSI entsprechend konfiguriert ist. Einige Server werden durch die Dateiendung '.shtml' anstatt '.html' zur Verarbeitung von SSI veranlaßt. Zudem lassen sich per SSI keine Scripte auf fremden Rechnern ausführen. Weitere Dokumentation (Apache) findet sich unter http://www.apache.org/docs/mod/mod_include.html Siehe auch: perldoc CGI.pm ---------------------------------------------------------------------- Wie kann man einen URL von einem Perl-Skript holen lassen? ---------------------------------------------------------------------- Um eine HTML-Datei von einem anderen Server anzusprechen, verwendet man das Modul LWP::Simple aus dem CPAN. Beispiel: #!/usr/bin/perl use warnings; use strict; use LWP::Simple; my $URL = 'http://www.example.com'; my $page = get($URL); die "Fehler beim Holen von $URL: $!" unless defined $page; Siehe auch: perldoc LWP::Simple ---------------------------------------------------------------------- Wie extrahiert man URLs aus einer HTML-Datei? ---------------------------------------------------------------------- Man verwendet das Modul HTML::LinkExtor aus dem CPAN. Siehe auch: perldoc HTML::LinkExtor, perldoc -q url ---------------------------------------------------------------------- Wie generiert man einen gültigen HTML 4.x Header? ---------------------------------------------------------------------- Der HTML-Standard 4.x sieht vor, dem Document-Header eine Definition des verwendeten Charsets hinzuzufügen. Dies geschieht mittels print "Content-Type: text/html; charset=iso-8859-1\r\n\r\n"; wobei iso-8859-1 lediglich ein Beispiel ist. Siehe auch: perldoc CGI.pm ---------------------------------------------------------------------- Wie kann man die IP-Adresse eines Clients ermitteln? ---------------------------------------------------------------------- In der Theorie steht die IP-Adresse eines Clients in der Environment Variable $ENV{'REMOTE_ADDR'}. Allerdings verwenden viele User heutzutage einen Proxyserver. Somit bekommt man lediglich die Adresse des Proxyservers heraus. Eine Ausnahme bildet der Fall, wenn der Proxy-Server selbst eine Variable setzt. Dann findet sich die IP-Adresse gemeinhin unter $ENV{'HTTP_CLIENT_IP'}. ---------------------------------------------------------------------- Wie implementiere ich ein Session-Tracking? ---------------------------------------------------------------------- Da HTTP mit nicht-persistenten Verbindungen arbeitet (nach einem Request ist die Verbindung zwischen Webserver und Client unterbrochen) ist ein Session-Tracking nicht trivial. Grundsätzlich kann man folgende Methoden in Betracht ziehen: - Cookies Man setzt auf dem Client ein Cookie. Wenn der Client diesen ablehnt oder der Empfang ausgeschaltet ist, funktioniert diese Methode nicht. - HTML Hidden-Fields Man übergibt der HTML-Seite ein sogenanntes Hidden Field, in dem man Informationen über die Session speichert. Vorrausetzung dafür ist aber, daß das CGI-Script bei jeder Aktion des Clients aufgerufen wird, um dessen Session ID nicht zu verlieren. Siehe auch: perldoc CGI.pm, perldoc CGI::Cookie ###################################################################### ANHANG ###################################################################### ---------------------------------------------------------------------- Kontakt ---------------------------------------------------------------------- Kritik, Anregungen und Ergänzungen sind immer willkommen. Schreibt eine Mail an Volker Rattel mit dem Betreff "dclpc-faq". Die aktuelle Version dieses Dokumentes ist unter folgender Adresse zu erreichen: - ASCII http://www.worldmusic.de/perl/dclpc-faq.txt http://noarch.net/perl/dclpc-faq.txt - HTML http://www.worldmusic.de/perl/dclpc-faq.html http://noarch.net/perl/dclpc-faq.html Die ASCII-Version wird einmal in der Woche nach news:de.comp.lang.perl.cgi gepostet. ---------------------------------------------------------------------- History ---------------------------------------------------------------------- Dieses FAQ wurde inspiriert durch das von Jörgen W. Lang geschriebene mini-FAQ "[de.comp.lang.perl.misc] Erst lesen - dann posten" zu finden unter http://www.worldmusic.de/perl/mini-faq.txt und löst in der *.cgi Gruppe das "mini-FAQ" ab. Das "mini-FAQ" wird natürlich weiterhin in der *.misc Gruppe gepostet. Hintergrund: Durch die Aufsplittung der alten Gruppe de.comp.lang.perl in die beiden Untergruppen *.misc und *.cgi eignen sich die behandelten Themen für zwei FAQs. ---------------------------------------------------------------------- Credits ---------------------------------------------------------------------- Mein Dank geht an folgende Personen für Ihre Unterstützung und Mithilfe: - Jörgen W. Lang - Stefan Hornburg - Boris Piwinger - Martin H. Sluka - Philip Newton - Michael Gerth - Wolfgang Wiese - Udo Held - Thomas Berger - Martin Vorländer - Björn Höhrmann - Christian Lackas - Florian Weingarten - Thomas Neumann - Tobias Zimpel - Martin Ackermann - Thoren Johne - Tina Müller - Peter Kraume - Georg Rehfeld - Joachim Zobel - Tobias Wolter - Voelki - Ulrich Nehls - Frank Wiegand - Daniel Liebig ---------------------------------------------------------------------- Autor und Copyright ---------------------------------------------------------------------- Copyright (C) 1999 - 2005 by Volker Rattel Alle Rechte vorbehalten. ---------------------------------------------------------------------- Disclaimer ---------------------------------------------------------------------- Die hier aufgeführten Antworten sind nach bestem Wissen und Gewissen zusammengestellt worden. In jedem Fall gilt natürlich TMTOWTDI (There's More Than One Way To Do It). Der Autor übernimmt keinerlei Haftung für die Richtigkeit der hier beschriebenen Methoden. Die Verwendung der Informationen aus diesem Dokument geschieht auf eigene Verantwortung. ---------------------------------------------------------------------- Changes ---------------------------------------------------------------------- 20 Nov 2005 23 Okt 2005 17 Jul 2004 07 Nov 2003 19 Okt 2003 27 Jul 2003 25 Mai 2003 17 Feb 2002 09 Sep 2001 14 Mai 2001 07 Apr 2001 12 Nov 2000 03 Okt 2000 14 Aug 2000 17 Jun 2000 08 Jun 2000 14 Apr 2000 24 Jan 2000 10 Dez 1999 29 Nov 1999 __END__