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
Das ist ganz schlimm böse. Nicht nur, dass du Daten von außen ungeprüft im Script weiter verwendest, nein, du baust sie auch noch unbehandelt in ein SQL-Statement ein.
Jetzt habe ich gemerkt, dass bei Vorkommen von % im login dies als Platzhalter interpretiert wird. Worauf ich das like durch = ersetzt habe.
Ein LIKE ist nicht nötig, der einfache Vergleich mittels Gleichheitszeichen reicht aus.
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.
Ja, dein Code ist hochgradig anfällig für derartige Injections.
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).
Du kannst dich bei MySQL auf die interne quote-Methode verlassen. Am elegantesten geht das m.E. über Platzhalter:
my $query = 'SELECT usr_pwd FROM USERtab WHERE usr_login=? AND usr_del=?';
my $sth = $dbh->prepare($query)|| die "Preparing statement $stm failed: $DBI::errstr";
$sth->execute($login, $status) || die "Executing statement failed: $stm: $DBI::errstr";
my $pwFromInput = param('password');
Siehe oben.
Siechfred
Ich bin strenggenommen auch nur interessierter Laie. (molily)