Hi,
ich habe ein Loginscript, bei dem der User Namen und Passwort in ein Formular eintraegt und diese Eingaben dann auswertet.
Zur Ueberpruefung hatte ich vorher folgende Anweisungen (etwas vereinfacht):
...
my $login = param('login');
my $query = "select usr_pwd from USERtab where usr_login like '$login' and usr_del='false'"; // query, das spaeter ausgefuehrt wird
...
Jetzt habe ich gemerkt, dass bei Vorkommen von % im login dies als Platzhalter interpretiert wird. Worauf ich das like durch = ersetzt habe.
So war es aber immernoch nicht sicher, da der User bei login ja beispielsweise "' or '1=1" schreiben haette koennen und das Script dann trotzdem korrekt ausgefuehrt worden waere. Noch schlimmer waere es natuerlich, wenn er dort die Datenbank mit update oder insert direkt manipuliert, was bisher wohl auch moeglich gewesen waere.
1. Frage:
Reicht es aus, den String $login mit quotemeta() zu maskieren, oder ist es dann immernoch nicht sicher. Sowohl bei = als auch bei like (wird an anderen Stellen benoetigt).
2. Frage:
Das eingegebene Passwort wird spaeter verschluesselt (mit crypt()) und mit dem ausgelesenen Passwort verglichen, was eigentlich dann wieder sicher sein sollte. Oder kann man ueber das PW auch noch irgendwie "boesen" Code einschleussen?
zugehoeriger Code, falls der login genau einmal gefunden wurde (ansonsten wird gleich eine Fehlermeldung ausgegeben):
...
my $pwFromInput = param('password');
if($pwFromDB eq crypt($pwFromInput,$salt))
{
# PW war korrekt...
}
else
{
# PW war inkorrekt...
}
mfG,
steckl