Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]3736[/thread]

Maßnahmen gegen SQL-Injection



<< >> 6 Einträge, 1 Seite
Superfrank
 2006-11-07 15:05
#34864 #34864
User since
2006-09-05
164 Artikel
BenutzerIn
[default_avatar]
Hallo,
wie kann man eine Anwendung am Besten gegen SQL-Injection schützen? Aktuell filtere ich Zeichen wie Quotingzeichen, Semikolon oder Sternchen heraus oder arbeite mit einer Whiteliste.
Dazu überlege ich noch, ob ein eigener User für select-Abfragen sinnvoll ist, der nur Leserechte hat, oder ob man sich das sparen kann, wenn man die übergebenen Variablen gewissenhaft prüft.
Reicht es alles durch einen regex zu schicken oder gibt sonst noch etwas zu beachten?

Grüsse

Frank
renee
 2006-11-07 15:10
#34865 #34865
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Man sollte auf jeden Fall die ?-Schreibweise von CPAN:DBI verwenden. Also statt:
Code: (dl )
1
2
3
my $sql = "SELECT * FROM user WHERE user = '$user'";
my $sth = $dbh->prepare($sql);
$sth->execute()


sollte das hier verwendet werden:
Code: (dl )
1
2
3
my $sql = "SELECT  * FROM user WHERE user = ?";
my $sth = $dbh->prepare($sql);
$sth->execute($user);


Die Fehlerabfragen habe ich der übersichtlichkeit wegen weggelassen...

Durch das ? werden alle Sonderzeichen automatisch gequotet
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Taulmarill
 2006-11-07 16:29
#34866 #34866
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
das mit dem eigenen user mit nur leserechten bringt dich übrigens auch nicht viel weiter. es ist schon ausreichend interessant wenn man per sql-injection beispielsweise das admin-passwort auslesen kann. imho ist die methode, die esskar beschrieben hat, die beste. damit ist man praktisch imun gegen böse sql-geschichten. du kannst dir ausserdem mal module wie DBIx::Class oder Class::DBI anschauen. die quoten automatisch und man muss noch nicht mal mehr sql schreiben :-)
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
nepos
 2006-11-07 16:52
#34867 #34867
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wobei der eigene User mit nur SELECT-Rechten sicher auch nicht schaden kann.
Froschpopo
 2006-11-07 22:53
#34868 #34868
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ich arbeite in Einzelfällen auch mit DBI::quote(). Das ist dasselbe wie mit Platzhaltern, nur etwas übersichtlicher weil ich es manchmal etwas kompliziert finde, bei der reihenfolge mit den platzhaltern den überblick zu behalten.
Superfrank
 2006-11-15 11:48
#34869 #34869
User since
2006-09-05
164 Artikel
BenutzerIn
[default_avatar]
Hallo,
erstmal vielen Dank für Eure Antworten, auf jeden Fall werde ich ab jetzt immer mit den von Renee angesprochenden Platzhaltern arbeiten, DBIx::Class ist wohl eher für größere Sachen geeignet und werde ich mir nochmal reinziehen.

Die Abfragen sehen jetzt z.B. so aus:

Code: (dl )
$sth = mysql_query($dbh, "SELECT kunden_nr FROM kunden WHERE email = ? AND prvanswer = ?", [$email, $prvanswer]);


und werden in meiner mysql_query()-Funktion weiterverarbeitet, wo alles weitere passiert.

Auf jeden Fall ist mir nun keine SQL-Injection oder das Provozieren einer fehlerhaften Query mehr gelungen und en eigenen Select-User schenke ich mir nun.

Grüsse

Frank
<< >> 6 Einträge, 1 Seite



View all threads created 2006-11-07 15:05.