SQL Code richtig?

ZaoDaDong  02.12.2022, 12:48

Was für ein Fehler wird denn geworfen? Ein SQL-Error oder ein PHP Fehler?

raleD 
Fragesteller
 02.12.2022, 13:30

SQL

ZaoDaDong  02.12.2022, 13:31

In dem Fall ist die query falsch formuliert. Die Antwort von Functional sollte es lösen.

raleD 
Fragesteller
 02.12.2022, 13:34

Ja, ist gelöst

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Die Werte $username, $email usw. müssen in Anführungszeichen gesetzt sein wenn es sich um Strings handelt.

"INSERT INTO User (Name, Email, Password, Created) VALUES ($username, $email, $password, $time)"
würde so interpreteiert

"INSERT INTO User (Name, Email, Password, Created) VALUES (LeBonyt,lebonyt@gf.net,geht_so_nicht, 12-10-2022)"

Das ist falsch. Daher

"INSERT INTO User (Name, Email, Password, Created) VALUES ('$username','$email', '$password', '$time')"

Da gehört wenigstens eine Verschlüsselung drauf (ideal gesalzen).

Und zwar mindestens md5. 'Profis' dürfen ungehashten Passwörter aus rechtlichen Gründen niemals speichern. Passwörter dürfen nie bekannt sein. Dafür gibt es die Funktion 'Passwort vergessen'. was das alte Passwort überschreibt und durch ein neues ersetzt.

Woher ich das weiß:Berufserfahrung – Web Developer bei einem mittelständischen Portalbetreiber

Die ganzen Werte, die in VALUES (...) stehen, gehören in Anführungszeichen, da es sich wohl um Strings handelt:

$sql = "INSERT INTO User (Name, Email, Password, Created) VALUES ('$username', '$email', '$password', '$time')";

Allerdings hast du hier zwei ziemlich kritische Sicherheitsprobleme:

Wenn jemand als Benutzername nun das Folgende eingibt:

'); DELETE FROM User; --

Werden - je nach Datenbankkonfiguration - potentiell alle Benutzer gelöscht. Oder wenn jemand das hier eingibt:

'); UPDATE User SET Password='123'; --

Wird das Passwort aller Nutzer in "123" geändert. Womit wir zum zweiten Problem kommen: Deine Passwörter sind offensichtlich nicht verschlüsselt. Zusammen mit der SQL Injection ergibt das ein fantastisches Rezept für ein riesiges Desaster.

Du solltest die Passwörter also verschlüsseln, bevor du sie in die Datenbank packst, z.B. mit bcrypt und für die SQL-Queries Prepared Statements verwenden.

raleD 
Fragesteller
 02.12.2022, 13:29

Danke

0
Babelfish  02.12.2022, 13:37

Alles richtig, bis auf „verschlüsseln“. Passwörter werden nicht verschlüsselt. Stattdessen wird ein Passwort-Hash gespeichert.

Das meinst du sicherlich auch und bcrypt ist auch absolut richtig. Wenn du aber von Verschlüsselung redest, erwartet der Fragesteller auch, dass man die Passwörter wieder entschlüsseln kann, was eben nicht der Fall ist.

0

SQL und Feldnamen wie "Name" sollte man möglichst vermeiden. Das geht selten gut. (Ist aber hier nicht der Fehler!)

Unabhängig vom Syntaxfehler, der bereits von dnpdnp2 beschrieben wurde: Du wirst doch wohl keine Passwörter im Klartext in der Datenbank speichern wollen?

Da gehört wenigstens eine Verschlüsselung drauf (ideal gesalzen).