PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : CGI-Parameterübergabe



Xanti
19.03.2006, 08:37
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



...<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



<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

Wolfgang
19.03.2006, 15:55
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:


#!/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.

Xanti
19.03.2006, 18:03
Danke Wolfgang, ich schaus mir mal genauer an.


...

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

Yep, der User ist by default evil ;)

Xanti
20.03.2006, 14:13
...
PS Vorsicht immer bei solchen Parametern.
Motto: traue keiner Usereingabe.

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

cremi
20.03.2006, 14:38
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

ich hoffe du bist auch mit einer antwort von mir zufrieden ;)



#!/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:


laurin@twoflower:~$ perl ab.pl
A
B
V
err
err

Xanti
20.03.2006, 14:52
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

cremi
20.03.2006, 15:29
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

Xanti
20.03.2006, 19:00
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

Wolfgang
20.03.2006, 19:07
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

Xanti
20.03.2006, 19:09
Danke :)

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