SQL Code richtig?
Hier ist PHP Code, den ich geschrieben hab:
$connection = new mysqli("localhost", "...", "...", "...");
$username = $_POST['username'];
$email = $_POST['email'];
$password = $_POST['password'];
$time = time();
$sql = "INSERT INTO User (Name, Email, Password, Created) VALUES ($username, $email, $password, $time)";
$connection->query($sql);
$connection->close();
Aber der sagt dann dass im SQL Code
$sql = "INSERT INTO User (Name, Email, Password, Created) VALUES ($username, $email, $password, $time)";
Ein Syntax Fehler ist.
Wo ist der Fehler?
Was für ein Fehler wird denn geworfen? Ein SQL-Error oder ein PHP Fehler?
SQL
In dem Fall ist die query falsch formuliert. Die Antwort von Functional sollte es lösen.
Ja, ist gelöst
4 Antworten
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.
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.
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).
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.