PERL
[ HOME | mini-faq | dclpc-faq | checkliste | perlbuch | idiot's guide ]

Volker Rattels FAQ für die newsgroup de.comp.lang.perl.cgi


Anmerkung: Dieses Dokument liegt auch in den folgenden Formaten vor [ .txt ]
From: Volker Rattel <vrattel@noarch.net> 
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 <auto> 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 <foo@example.com>
        To: Bar <bar@example.com>
        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:

        <a href="./my_script.cgi">Click</a>

    Dies erzeugt einen Textlink, der das Script my_script.cgi
    aufruft.

    Um dem Script Parameter zu übergeben, können diese angehängt
    werden.

    Beispiel:

        <a href="./my_script.cgi?id1=1&amp;id2=2">Click</a>

    Anmerkung:

        Gemäß HTML 4.0 sollten Parameterverknüpfungen per '&' im
        HTML-Code durch ein '&amp;' 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:

        <form action="./my_script.cgi" method="post">
          <input type="text" name="id1" />
          <input type="text" name="id2" />
          <input type="submit" value="Click" />
        </form>

    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:

        <!--#include virtual="/cgi-bin/my_script.pl?id1=1&id2=2" -->

    oder

        <!--#exec cgi="/cgi-bin/my_script.pl" -->

    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 <vrattel@noarch.net> 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 <vrattel@noarch.net>
    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__