Sicherheit CGI-Modul param
Flury
- perl
0 Vinzenz Mai0 Horst0 Struppi
0 Flury0 Struppi
0 Alexander (HH)
Hi zusammen,
ich bastle zur Zeit an einem Script das Formulardaten empfängt via perl-cgi-modul. Danach werden die Daten in eine DB gepumpt via dbi-modul.
Nun meine Frage ...
Was macht ihr so um sicherzustellen, dass niemand - ich nenns mal - Schadcode überträgt bzw. falls er übertragen wird diesen festzustellen und abzuweisen.
Ich hab zum Beispiel ein Feld das "Bemerkung" heisst und da kann man u.a. auch Klammern und andere Sonderzeichen eintragen. Ich wüsste jetzt nicht wie ich da parsen sollte.
Ich will nicht paranoid sein, aber eben auch nicht offen wie ein Scheunentor.
Danke für Ratschläge/Erfahrungen.
MFG
Flury
Hallo,
ich bastle zur Zeit an einem Script das Formulardaten empfängt via perl-cgi-modul. Danach werden die Daten in eine DB gepumpt via dbi-modul.
Was macht ihr so um sicherzustellen, dass niemand - ich nenns mal - Schadcode überträgt bzw. falls er übertragen wird diesen festzustellen und abzuweisen.
ich nutze zwar kein Perl für sowas, aber Du könntest zum Beispiel Prepared Statements verwenden.
Freundliche Grüße
Vinzenz
Hi,
wie ich das mache:
1. überprüfe ich, ob der Parameter gültig ist. Dazu gibt es eine Liste, die im Script hinterlegt ist.
2. wenn möglich, überprüfe ich, ob der value zum Parameter gültig ist. z.B. lässt sich ein ?lfdnr=33 einfach prüfen, wenn lfdnr der Feldname der Datensatznummer ist und 33 ein möglicher Wert. Ein lfdnr=44 gibt Fehlermeldung, wenn der DS mit lfdnr 44 nicht existiert.
3. Values für insert/update quote ich mit $dbh->quote();
Viele Grüße,
Hotte
Hi,
- Values für insert/update quote ich mit $dbh->quote();
ich hab jetzt mal die Funktion quote benutzt.
my $quoted_email = $main::dbh->quote($_[0]);
my $quoted_pw = $main::dbh->quote($_[1])
my $sql = qq{INSERT INTO xxx (emailuser,pw,timestamp) VALUES (?,?,unix_timestamp())};
my $sth = $main::dbh->prepare ($sql) || die "Kann Statement nicht vorbereiten: $DBI::errstr\n";
$sth->execute($quoted_email,$quoted_pw) || die "Kann Abfrage nicht ausfuehren: $DBI::errstr\n";
$sth->finish;
Nun hab ich aber das "Problem", dass in meiner MySql-DB die Werte auch mit quotes drinstehen - sprich 'test@test.de' anstatt test@test.de. Speziell wenn ich wenn ich die Daten verarbeiten will (z.b. nach einem select), muss ich dann ja erst wieder die Quotes löschen. Hmmm - ist das wirklich gut so? Bei anderen Tabellen von irgendwelchen nicht unbekannten opensource-projekten ist nirgendwo ein Wert gequoted in der DB.
ciao,
Flury
- Values für insert/update quote ich mit $dbh->quote();
ich hab jetzt mal die Funktion quote benutzt.
Du "quotest" jetzt doppelt.
Struppi.
- Values für insert/update quote ich mit $dbh->quote();
ich hab jetzt mal die Funktion quote benutzt.
Du "quotest" jetzt doppelt.
Struppi.
Ah, heisst das, dass diese Aktion hier - http://search.cpan.org/~timb/DBI/DBI.pm#Placeholders_and_Bind_Values - schon qoutet?
Ok, dann werde ich das quote() mal wieder rausnehmen ;)
DANKE!
ciao,
flury
Ich will nicht paranoid sein, aber eben auch nicht offen wie ein Scheunentor.
Das Problem ist nicht das CGI Modul, das empfängt die Daten so wie sie gesendet werden und das ist auch gut so. Was damit passiert ist dann deine Entscheidung. Allgemein ist es ratsam keine CGI Eingaben ungeprüft irgendwo zu verwenden. Für das DBI Modul bieten sich "Placeholders and Bind Values" an.
Struppi.
Ich will nicht paranoid sein, aber eben auch nicht offen wie ein Scheunentor.
Das Problem ist nicht das CGI Modul, das empfängt die Daten so wie sie gesendet werden und das ist auch gut so. Was damit passiert ist dann deine Entscheidung. Allgemein ist es ratsam keine CGI Eingaben ungeprüft irgendwo zu verwenden. Für das DBI Modul bieten sich "Placeholders and Bind Values" an.
Struppi.
Hi,
ich benutze immer so ein Konstrukt:
my $sql = qq{INSERT INTO xxx (emailuser,pw,timestamp) VALUES (?,?,unix_timestamp())};
my $sth = $main::dbh->prepare ($sql) || die "Kann Statement nicht vorbereiten: $DBI::errstr\n";
$sth->execute($quoted_email,$quoted_pw) || die "Kann Abfrage nicht ausfuehren: $DBI::errstr\n";
$sth->finish;
Wenn ich dich richtig verstanden habe ist dies nicht allzu dumm.
ciao,
Flury
Wenn ich dich richtig verstanden habe ist dies nicht allzu dumm.
Was DB Zugriffe angeht, ist es wohl der Beste Weg.
Struppi.
Moin Moin!
Mal sehen, ob noch jemand mitliest ... ;-)
Data::FormValidator bietet sich an, um die eingegebenen Daten gründlich zu prüfen. Außerdem schadet es nicht, den Taint-Mode zu aktivieren und auch DBIs Taint-Checks zu aktivieren.
Außerdem: Zitat 1039
Ansonsten ist zum Thema alles gesagt: DBI prepare mit Platzhaltern statt SQL-Kommando mit reingepfuschtem quote(), weil man quote versehentlich mal vergessen kann.
Alexander