CGI-Parameterübergabe

Dieses Thema: "CGI-Parameterübergabe" im Forum "Web- & File-Services" wurde erstellt von Xanti, 19.03.2006.

  1. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Hallo,

    ich hab mir mal CGI in Verbindung mit Perl angeschaut und habe noch ein kleines Problemchen:

    Wenn ich auf der Webside mein Perl-Skript mit Parameter aufrufen will, dann mach ich das mittels

    Code:
    ...<a href="/cgi-bin/beispiel.pl?0&0">...
    
    Im Perl-Skript selber kommen die Parameter als @ARGV = ("0\&0") an. Das ist an sich kein Problem. Was mich stutzig macht, ist, dass wenn ich die Parameter mittels

    Code:
    <form action="/cgi-bin/beispiel.pl" method="post">
    
    generiere, sind diese Parameter im STDIN und werden auch richtig als "0&0" übergeben. Daher meine Frage: mach ich bei meiner ersten Parameterübergabe einen Fehler?

    Gruss, Xanti
     
  2. Anzeige

    Schau dir mal diesen Ratgeber an. Viele Antworten inkl. passender Shell-Befehle!
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Wolfgang, 19.03.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo

    Ich sehe da kein echtes Problem.
    Die Methode "POST" übergibt ja die Parameter an <STDIN> des aufgerufenen Skripts.
    Bei der Methode GET dagegen wird es URL-ENCODET übereicht.
    Entweder dür prüfst die Methode direkt, oder verwendest sinnvollerweise gleich das Modul CGI. Dort bekommst du dann nämlich die Parameterliste unabhängig von der Methode wie du sie brauchst.
    Das erspart dir eine Menge Arbeit.

    Ich verwende zum Testen meiner Formularscripte ein Dump-Script, welches mir einfach alle übergebenen Werte nebst aller sichtbaren Umgebungsvariablen ausgibt. Das eignet sich gut zum Debuggen, und nebenbei auch zum Testen anderer Formulare. Diese einfach auf den eigenen Webserver kopieren und an das eigene Script senden. Dann sieht man schön was alles übermittelt wird.

    formdump.cgi:
    Code:
    #!/usr/bin/perl
    
    # print all data - get from form - and all %ENV
    # simple edit your form <form action="URL to this script" method="POST|GET">
    
    use CGI qw/:standard :html3 :FatalsToBrowser/;
    use strict;
    my @th=("Key", "Wert");
    my $referer =$ENV{HTTP_REFERER};
      print header( ),
       start_html( '-title' => 'Parameter Dump'),
       h2( 'Alle Parameter:'),
       h2(($referer)?$referer:"Kein HTTP_REFERER"),
       CGI::as_string(),
      
      p(h2({align => "center"},"Umgebungsvariablen")),br(),
      table({ align => "center", width =>"80%", bgcolor =>"#9999ff", "-border"=>1},
            TR(map{ th(b($_))} @th),"\n",
            map{TR(td($_),td($ENV{$_})),"\n"} sort keys %ENV),"\n",
       end_html();
                                              
    

    Gruß Wolfgang
    PS Vorsicht immer bei solchen Parametern.
    Motto: traue keiner Usereingabe.
     
  4. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Danke Wolfgang, ich schaus mir mal genauer an.

    Yep, der User ist by default evil ;)
     
  5. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Hallo Wolfgang,

    was empfiehlst Du als schneller, billiger Schutz gegen bösartige Usereingaben? Bei numerischen Parametern ist das kein Problem, jetzt muss ich einen Text übergeben. Reicht es, wenn ich "{}" oder andere Sonderzeichen abfange?

    Gruss, Xanti
     
  6. #5 cremi, 20.03.2006
    Zuletzt bearbeitet: 20.03.2006
    cremi

    cremi Dude

    Dabei seit:
    15.02.2004
    Beiträge:
    329
    Zustimmungen:
    0
    Ort:
    AUT/Ktn
    ich hoffe du bist auch mit einer antwort von mir zufrieden ;)

    Code:
    #!/usr/bin/perl
    ##
    ##  Input Forum for seq.pl
    ##
    
    
    $String='ABV\0';
    $flag=0;
    
    for ($i = 0; $i < length($String); ++$i)
    {  $c=substr($String,$i,1);
       if( $c =~ /[A-Z]/ )   
       {  print "$c\n";
       }
       else
       {  print "err\n";
       }
    }
    
    vielleicht hilft dir dieses kleine script

    Ausgabe:
    Code:
    laurin@twoflower:~$ perl ab.pl
    A
    B
    V
    err
    err
    
     
  7. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Hallo Cremi,

    danke für Deine Antwort. Leider ist Deine Antwort etwas restriktiv. Ich möchte zum Beispiel auch Satzzeichen und Zahlen zulassen, eigentlich soviel, wie möglich ist, so dass es noch sicher ist. Mich würde also eher interessieren, was ich an Eingabe verbieten soll, nicht was ich zulasse, und dass rein theoretisch, die Umsetzung in Perl muss nicht sein ;)

    Gruss, Xanti
     
  8. cremi

    cremi Dude

    Dabei seit:
    15.02.2004
    Beiträge:
    329
    Zustimmungen:
    0
    Ort:
    AUT/Ktn
    hab dich dann doch falsch verstanden - ich dachte du willst wissen wie du in perl herausfindest, ob sonderzeichen in deinem übergabeparameter sind.

    wenn du wissen willst, welche zeichen du zulassen sollst oder nicht, dann würd ich sagen, kommt es auf den kontext an den der user eingeben soll.
    aber grundsätlich kannst du alle Sonderzeichen (also ascii code 33 bis 126) zulassen, damit sollts keine probleme geben
     
  9. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Ich hab wie gesagt keine Ahnung, welcherart bösartigen Code man mittels Parameter übertragen kann, damit er dann vom apache ausgeführt wird. Vielleicht kann jemand dafür Beispiele bringen.

    Gruss, Xanti
     
  10. #9 Wolfgang, 20.03.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo

    Die Eingabe bei Text wird erst dann problematisch, wenn du ungeprüft Daten übernimmst.

    Entscheidend ist dabei auch, wie du die Daten verarbeitest.

    Lücken können sich auch schon beim Versenden des Formularinhaltes auftun, bevor diese überhaupt in deinem Script ankommen. Das sind dann aber Dinge, die mehr mit der Servereinstellung zu tun haben.

    Generell kannst du jeden Text zulassen, wenn die Daten vor der Verarbeitung richtig geprüft werden.
    Sonderzeichen über GET sind dabei zwar ein beliebtes Angriffsziel, was aber nicht zwangsläufig zu einem Sicherheitrisiko führen muss.

    - Ich empfehle ohnehin die POST-Methode.
    - Vermeide Text ungeprüft an systemnahe Befehle weiterzugeben.
    - (system, eval open, exec und glob)
    - Wenn nicht vermeidbar, dann Sonderzeichen immer richtig escapen.

    So kann eigentlich kaum noch etwas passieren.

    Relevante Zeichen die ungeprüft gefährlich werden können sind IMHO folgende


    ; < > * | " & $ ! # ( ) [ ] { } : ; ' ` ? ^ \


    Wie gesagt, musst du die nicht alle verbieten sondern nur bei der Verarbeitung beachten.

    Gruß Wolfgang
     
  11. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Danke :)

    Das mit dem Escapen ist wahrscheinlich das einfachste. Wird sofort umgesetzt.
     
Thema:

CGI-Parameterübergabe