Serverseitige Formularprüfung
Michael
- perl
0 Michi
Hallo Leute!
Ich beginne gerade mit Perl CGI's und habe recht
schnell mein erstes Ziel erreicht:
Der Benutzer auf meiner Webseite meldet sich für
einen Newsletter an - seine Daten werden in eine
Textdatei (später einmal MySQL-Datenbank) ausgelesen.
Meine Frage: ich habe in selfhtml und mehreren Büchern
gelesen, dass man unbedingt eine serverseitige Formular-
prüfung installieren soll.
Also: kann mir jemand sagen, wo es ein Tutorial / Buch
oder sogar ein fertiges Script für solch eine Prüfung
gibt?
Danke im Voraus!
Hi Michael,
» Also: kann mir jemand sagen, wo es ein Tutorial / Buch
oder sogar ein fertiges Script für solch eine Prüfung
gibt?
Was willst du denn eigentlich Prüfen?
Gemeint ist mit einer serverseitigen Überprüfung, dass du kontrollieren solltest, ob der user auch das eingetragen hat, was du willst. Also dass z.B. im Feld Telefonnummer auch eine Folge von Nummern steht und nicht "abc". Der beste Weg in Perl sind meiner Meinung nach RegEx. Ein kleines Tutorial erhälst du mittels "man perlretut", falls du unter Linux arbeitest (und die Manfiles installiert hast).
Gruß Michi
Zuerst mal Danke für die Antwort. Tatsächlich geht es mir aber
um eine andere Prüfung, denn so wie ich Deinen Vorschlag verstehe,
würde das auch mit JavaScript funktionieren.
Ich brauche eine Überprüfung, die meinen Server vor böswilligen
Hackereingaben schützt. In mehreren Büchern wird auf die Gefahren
von solchen Eingaben hingewiesen - doch nirgends steht, wie man sich
davor schützen kann.
Gruß Michael
Hi Michael,
» Also: kann mir jemand sagen, wo es ein Tutorial / Buch
oder sogar ein fertiges Script für solch eine Prüfung
gibt?
Was willst du denn eigentlich Prüfen?
Gemeint ist mit einer serverseitigen Überprüfung, dass du kontrollieren solltest, ob der user auch das eingetragen hat, was du willst. Also dass z.B. im Feld Telefonnummer auch eine Folge von Nummern steht und nicht "abc". Der beste Weg in Perl sind meiner Meinung nach RegEx. Ein kleines Tutorial erhälst du mittels "man perlretut", falls du unter Linux arbeitest (und die Manfiles installiert hast).
Gruß Michi
Halihallo
Zuerst mal Danke für die Antwort. Tatsächlich geht es mir aber
um eine andere Prüfung, denn so wie ich Deinen Vorschlag verstehe,
würde das auch mit JavaScript funktionieren.
Natürlich, nur, dass man die Übertragung der Daten "simulieren" kann und somit die Client-seitige Verifikation der Daten einfach zu umgehen ist (für die genannten "Hacker"). Nicht so, wenn du die Daten auf'm Server überprüfst.
Ich brauche eine Überprüfung, die meinen Server vor böswilligen
Hackereingaben schützt. In mehreren Büchern wird auf die Gefahren
von solchen Eingaben hingewiesen - doch nirgends steht, wie man sich
davor schützen kann.
Dazu gibt's keine allgemeine Vorgehensweise im Stile einer Check-List. Du musst dir überlegen, was denn für dein Programm an Eingaben gefährlich werden kann bzw. was für Daten valide sind und dann so programmieren, dass falsche Eingaben abgefangen werden.
Viele Grüsse
Philipp
Hallo Phillipp,
jetzt macht die Sache einen Reim. Ich befürchte nur, dass ich
Perl zu wenig kenne, um Gefahren in dieser Richtung beurteilen
zu können.
Aber rein gefühlsmäßig kann bei meinem einfachen Skript nichts
passieren.
Alles was mit den Variablen aus dem Formular passiert ist, dass
sie mit folgendem Kommando in die Textdatei geschrieben werden:
print DATEI "$anrede,$name,$vorname,$firma,$email";
Vielleicht kannst Du mir noch sagen, ob die Gefahren in Verbindung
mit mySQL größer werden.
Auf jeden Fall erst einmal: Vielen Dank und viele Grüße
Halihallo
Zuerst mal Danke für die Antwort. Tatsächlich geht es mir aber
um eine andere Prüfung, denn so wie ich Deinen Vorschlag verstehe,
würde das auch mit JavaScript funktionieren.
Natürlich, nur, dass man die Übertragung der Daten "simulieren" kann und somit die Client-seitige Verifikation der Daten einfach zu umgehen ist (für die genannten "Hacker"). Nicht so, wenn du die Daten auf'm Server überprüfst.
Ich brauche eine Überprüfung, die meinen Server vor böswilligen
Hackereingaben schützt. In mehreren Büchern wird auf die Gefahren
von solchen Eingaben hingewiesen - doch nirgends steht, wie man sich
davor schützen kann.
Dazu gibt's keine allgemeine Vorgehensweise im Stile einer Check-List. Du musst dir überlegen, was denn für dein Programm an Eingaben gefährlich werden kann bzw. was für Daten valide sind und dann so programmieren, dass falsche Eingaben abgefangen werden.
Viele Grüsse
Philipp
Hi, Phillipp,
jetzt macht die Sache einen Reim. Ich befürchte nur, dass ich
Perl zu wenig kenne, um Gefahren in dieser Richtung beurteilen
zu können.
Ich würde auf jeden Fall quotemeta () (oder eine ähnliche selbstgeschriebene Funktion) benutzen, was zwar keine speziellen Gefahren für dein Script ausschließt, aber allgemeine Gefahren etwas verringert.
#quotemeta wird in etwa so angewendet:
quotemeta $anrede; #bei einzelnen Variablen,
Quotemeta ($anrede, $blablabla); # bei mehreren Variablen.
mfg Andres
Halihallo
Hi, Phillipp,
Wohl eher Michael, oder? ;)
jetzt macht die Sache einen Reim. Ich befürchte nur, dass ich
Perl zu wenig kenne, um Gefahren in dieser Richtung beurteilen
zu können.
Ich würde auf jeden Fall quotemeta () (oder eine ähnliche selbstgeschriebene Funktion) benutzen, was zwar keine speziellen Gefahren für dein Script ausschließt, aber allgemeine Gefahren etwas verringert.
#quotemeta wird in etwa so angewendet:
quotemeta $anrede; #bei einzelnen Variablen,
Quotemeta ($anrede, $blablabla); # bei mehreren Variablen.
Nun, diese Aussage muss man aber sehr stark relativieren. Was du sagst, trifft nur für kleine Teilbereiche zu! - Z. B. wenn Strings an eine Datenbank übergeben werden, die selber gequotet stehen müssen.
Es gibt jedoch mindestens genauso viele, wenn nicht mehr, Anwendungsbereiche, wo dieses quotemeta völlig fehl am Platz ist. Oder was bringt dir ein quotemeta($name), wenn du das Feld dann in einer Textdatei speicherst??? - Musst du nachher nur decodieren und das alles nur, um eventuell ein \015 oder \012 zu erhalten, statt eines CR oder LF ist wohl etwas, naja, übertrieben.
Viele Grüsse
Philipp
Hi,
Aber rein gefühlsmäßig kann bei meinem einfachen Skript nichts
passieren.
Na, ja , wenn ich das richtig verstanden habe willst du deinen Usern die Möglichkeit bieten einen Newsletter zu abonieren. Nun solltest du vielleicht ungewollte email-Adressen rausfiltern, z.B. deine eigene. Du willst doch sicherlich nicht, dass irgendein Spaßvogel 1000 Newsletter an deine Email aboniert, oder? Andere sinnvolle Filter wären z.B. postmaster@microsoft.com, postmaster@yahoo.de oder ähnliche. Natürlich kannst du das ganze auch nachträglich per Hand machen, da ich davon ausgehe, dass du keine 100 neuen Newsletterabonenten pro Tag erwartest, aber per Sctipt geht das ganze doch einfacher.
Ciao Michi
Halihallo Michael
jetzt macht die Sache einen Reim. Ich befürchte nur, dass ich
Perl zu wenig kenne, um Gefahren in dieser Richtung beurteilen
zu können.
Aber rein gefühlsmäßig kann bei meinem einfachen Skript nichts
passieren.
Alles was mit den Variablen aus dem Formular passiert ist, dass
sie mit folgendem Kommando in die Textdatei geschrieben werden:
print DATEI "$anrede,$name,$vorname,$firma,$email";
Also hier musst du dich nicht fürchten. Das einzige, was hier sinnvoll sein könnte ist, dass du z. B. überprüfst, ob die Felder auch alle gesetzt sind bzw. ob die E-Mail gültig ist etc.
Ganz, ganz schlimmt wird's z. B. erst, wenn du etwa folgendes hast:
use CGI;
my $cgi = new CGI;
my $file = $cgi->param('forum_id');
open( F, '<'.$file );
...
close F;
hier kann man über die URL!!! eine Datei öffnen und wohl auch dessen Inhalt anzeigen =>>>> TÖDLICH!
PS: Hierzu vielleicht auch einen Verweis auf tainted => -T Schalter. Musst dich hierzu mal informieren. über Google findest du auch einiges über die Sicherheit von CGI-Scripts. Such einfach mal danach.
Vielleicht kannst Du mir noch sagen, ob die Gefahren in Verbindung
mit mySQL größer werden.
Eigentlich nicht. mysql, wie Dateien dienen nur zur Datenspeicherung. Das Problem entsteht im Script bzw. was das Script mit den "externen" (also durch das Internet übertragbaren) Daten macht.
Viele Grüsse
Philipp