Jörg: CGI-Skriptaufruf durch Direkteingabe verhindern

Hallo!

Ich habe oft gesehen, dass CGI(Perl)-Skripte nur durch verlinkte Seiten ausgeführt werden. Wenn ich zum Beispiel "http://www.seite.de/cgi-bin/skript.pl" eingebe kommt ein Server-Error.

Genau das ist das was ich möchte (Meine Skripte werden bei Direkeingabe ausgeführt). Mein Webhosting-Service sagte mir ich solle die mit HTTP_REFERER erledigen. Da HTTP_REFERER bei Frames (Netscape) bzw. bei Opera teilweise überhaupt nicht definiert ist suche ich nach einer anderen Lösung. (Ich programmiere mir Perl.)

Kann ich vielleicht serverseitig Einstellungen vornehmen, die mein Vorhaben in die Tat umsetzen? (--> Webshell???)

Hat jemand Ideen und Vorschläge für mich? - momentan ist meine Seite dadurch wenig professionell.

DANKE!

Schöne Grüsse,

Jörg

  1. hi!

    Hat jemand Ideen und Vorschläge für mich? - momentan ist meine
    Seite dadurch wenig professionell.

    HTTP_REFERRER ist quatsch, weil viele Leute den auch rausfiltern oder
    er nicht richtig funktioniert. Wenn dein Skript nur auf Formular-
    Eingaben reagiert, kannst du es ja zb. auf POST umstellen. Wenn das
    Skript dann keine Parameter erhält, zeigt es eine Fehlermeldung an.

    Wenn dein Skript zb. über einen Link aufgerufen wird und du deshalb
    unbedingt auch GET-Parameter brauchst, kannst wieder verlangen, dass
    das Skript auf jeden Fall Parameter erhält und darauf hoffen, dass
    deinen Besuchern zufällig den Skriptnamen aufgerufen haben oder es
    ihnen zu aufwendig ist, selbst die Parameter anzugeben. Oder du
    könntest die Ursprungsseite(n) auch dynamisch gestalten und allen
    Usern eine Session-ID verpassen. Falls die übergebene Session-ID
    ungültig ist, kommt dann eine Fehlermeldung.

    Die genaue Lösung für dein Problem kommt also ganz auf die Situation
    an. Wenn dir obiges nicht genügt, kannst du die ja nochmal etwas
    genauer beschreiben... :)

    bye, Frank!

    1. Hallo!

      Vielen Dank ihr beiden!!!

      Die genaue Lösung für dein Problem kommt also ganz auf die Situation
      an. Wenn dir obiges nicht genügt, kannst du die ja nochmal etwas
      genauer beschreiben... :)

      Zum Teil werden die Parameter per link übergeben
      (http://www.seite.de/cgi-bin/skipt.pl?wert=123")
      ansonsten per Formulare ausgewertet.

      Find ich arg, dass man mir erzählt mein Problem mit HTTP_REFERER zu lösen...!

      Wenn dein Skript zb. über einen Link aufgerufen wird und du deshalb
      unbedingt auch GET-Parameter brauchst, kannst wieder verlangen, dass
      das Skript auf jeden Fall Parameter erhält und darauf hoffen, dass
      deinen Besuchern zufällig den Skriptnamen aufgerufen haben oder es
      ihnen zu aufwendig ist, selbst die Parameter anzugeben.

      Diese Lösung ist mir klar - verstehe ich.

      Oder du

      könntest die Ursprungsseite(n) auch dynamisch gestalten und allen
      Usern eine Session-ID verpassen. Falls die übergebene Session-ID
      ungültig ist, kommt dann eine Fehlermeldung.

      Ich habe auf meiner Eingangsseite eine ID-Vergabe. Diese Nummer nimmt jeder User auf seinem Weg durch meine Webseite mit und wird daran erkannt. Meinst du so etwas oder ist Session-ID etwas anderes. Im Perl-Kochbuch habe ich leider nichts dazu gefunden...

      Danke nochmal...!!!

      Schöne Grüsse,

      Jörg

  2. Moin,

    Ich habe oft gesehen, dass CGI(Perl)-Skripte nur durch verlinkte Seiten ausgeführt werden. Wenn ich zum Beispiel "http://www.seite.de/cgi-bin/skript.pl" eingebe kommt ein Server-Error.

    Server Error = 500?
    In dem Fall sind die Scripte schlecht. Sie sollten wenigstens eine anstaendige Fehlermeldung o.ae. ausgeben.

    Genau das ist das was ich möchte (Meine Skripte werden bei Direkeingabe ausgeführt).

    kommt auf die Scripte an. Du kannst serverseitig (bei einem guten Server) die Request-Methode einschraenken und beispielsweise GET nicht zulassen (nur POST).
    Wenn das an deinem Server nicht geht, kannst du an den Anfang des Scripts etwa folgendes schreiben:

    die "method not allowed" unless ($ENV{REQUEST_METHOD} eq 'POST');

    erzeugt als erste Zeile (nach der Shebang) im Script einen Error 500, wenn das Script mit einen anderen Methode als POST aufgerufen wurde.

    etwas eleganter:

    #!/usr/bin/perl -w
    use strict;
    use CGI qw(header);

    unless ($ENV{REQUEST_METHOD} eq 'POST')
    print header(-status => '405 Method not allowed');
    print <<EOH;
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <HTML><HEAD>
    <TITLE>405 Method not allowed</TITLE>
    </HEAD><BODY>
    <H1>Method not allowed</H1>
    The Request Method '$ENV{REQUEST_METHOD}' is not allowed for the requested URI.<P>
    </BODY></HTML>
    EOT
    __END__

    Alternativ kannst du auch Error 400 nehmen (Bad Request).
    Das verhindert allerdings nicht, dass jemand, mit einem geeigneten Tool das Script auch per POST aufruft.

    Mein Webhosting-Service sagte mir ich solle die mit HTTP_REFERER erledigen. [...]

    Verlange dein Geld zurueck. Das ist Schwachsinn. Der Referrer ist wirklich ungeeignet.

    Kann ich vielleicht serverseitig Einstellungen vornehmen, die mein Vorhaben in die Tat umsetzen? (--> Webshell???)

    s.o.
    was ist eine Webshell?

    Hat jemand Ideen und Vorschläge für mich? - momentan ist meine Seite dadurch wenig professionell.

    Wieso wenig professionell? Das verstehe ich nicht.

    Viele Gruesse,

    n.d.p.