MySQL meldet Eingetragen, kontrolle zeigt: Nicht eingetragen

Ich habe in den letzten Tagen eine PHP-Seite geschrieben, die eine Registrierung des Nutzers machen soll. Nach dem Eintragen meldet dieser, dass der Eintrag erfolgreich sei. Jedoch ist nach einer Kontrolle in PHPMyAdmin klar, das dies nicht geschehen ist. Ich habe meinen Code geprüft, aber ich finde keinen Fehler. Kann es am Server liegen oder ist ein Fehler drinn, den ich nicht finde? Es wäre schön, wenn mir jemand helfen kann. Schonmal vielen Dank :slight_smile: .

1.Seite1: game_register.php:

Benutzername:

Passwort:



Email:



2.Seite2: game_register2.php

<?php //Verbinden mit Datenbank $verbindung = mysql_connect ("localhost", "blackymen", "****") or die ("keine Verbindung möglich. Benutzername oder Passwort sind falsch"); mysql_select_db("blackymen") or die ("Die Datenbank existiert nicht."); //Zählen der Einträge und Nummerierung des neuen Eintrags $abfrage = "SELECT COUNT(username) FROM game_user"; $ergebnis = mysql_query($abfrage)OR die("Error: $abfrage
".mysql_error()); $menge = mysql_fetch_row($ergebnis); $menge = $menge[0]; $neuemenge=$menge+1; //Empfangen der Daten und Eintragen in Variabeln $username = $_POST["username"]; $passwort = $_POST["passwort"]; $email = $_POST["email"]; //Passwort verschlüsseln und salzen $pass = md5($passwort); $passwort=$pass+$neuemenge; $pass = md5($passwort); //Eintragen der Daten $eintrag = "INSERT INTO game_user (number, username, password, email) VALUES ('$neuemenge', '$username', '$passwort','$email')" OR die("Error: $eintrag
".mysql_error()); if($eintrag == true) { echo "Eintrag war erfolgreich"; } else { echo "Fehler beim Speichern"; } //debuging echo $neuemenge; echo $username; echo $password; echo $email; ?>
  1. Ein Emailtyp bei Eingabefeldern ist mir nicht bekannt. Dafür fehlt das name-Attribut.

  2. Du musst die Einträge nicht zählen, dafür gibts auto increment, das ist die Funktionalität, die du nachzubauen versucht hast.

  3. Du trägst die Daten ja auch nicht ein, d.h. du definierst nur einen String, der eine Abfragesyntax enthält. Du musst natürlich dann mysql_query() oder ähnliches ausführen.

4) (!) Du hast deine Formularverarbeitung überhaupt nicht abgesichert, Stichwort SQL-Injection.

Mfg :wink2:

Vielen Dank für die schnelle Antwort und Ihre Mühe, sich meinen Code anzuschauen.
Ich habe die Änderungen durchgeführt und die Abfrage läuft jetzt. Auch großen Dank dafür, dass Sie mich auf das Problem der SQL Injection aufmerksam gemacht haben. Auf diese Sicherheitslücke wurde mir an der Stelle, wo ich MySQL gelernt habe nicht aufmerksam gemacht. Der Fehler im Formular ist mir im nachhinein ziemlich peinlich, aber wahrscheinlich siht man soetwas nicht, wenn man den Code selbst geschrieben hat
Vielen Dank :slight_smile: :slight_smile: :slight_smile:

Hallo blackymen,

ich habe mir das durchgelesen und mir persönlich fallen noch zwei Dinge ein.
Deine dtd

Willst du allerdings verwenden, solltest du html5 wählen. Klar, stellen das die Browser zwar meist richtig dar, aber wenn jmd mit einem schlechten, vielleicht sogar selbst gebauten, dann wird es schwierig.

Für das Testen würde ich Opera empfehlen, denn der hat formulartechnisch die beste html5-Unterstützung. Ich weiß allerdings nicht, wie es mit der neuen Chrome-Engine des Opera ist.

Außerdem, wie in der 29c3 wieder vorgebracht, machst du kein wirkliches Salting. Deines ist relativ schnell “zu knacken” mittels bestimmter Tabellen. php macht es dir da sehr einfach. Ich erklär schnell das Prinzip für die Anwendung. Warum man es einsetzen sollte, kann man überall nachlesen.

1.1. Zunächst generierst du beim Registrieren einen zufälligen String, der z.B. 20 Zeichen lang ist. Diesen speicherst du in der gleichen DB-Zeile, wie den Rest ab, in z.B. der Spalte salt VARCHAR(20).
1.2. Aus diesem Salt, den du bei diesem Vorgang noch in einer Variable hast, kannst du dann das gehashte Passwort erstellen, wie z.b. $salt = generateSalt(); $password = crypt($_POST[“passwort”], “$5$rounds=5000$”.$salt."$");
1.3. Dann kannst du eintragen “INSERT INTO …”
(1.4. Nenn einen Eintrag id, denn du in phpmyadmin mit auto_increment setzt und zusätzlich den Haken bei primary_key setzt)

2.1. Beim Login ließt du zunächst aus, ob der username passt “SELECT salt, password, wrong_tries FROM game_user WHERE username = '”.mysql_escape_string($_POST[“username”])."’;“
2.2. Prüfst mit mysql_num_rows(), ob die Ergebnismenge > 0 ist und anschließend, ob wrong_tries kleiner als 5 ist oder so
2.3. Anschließend, ob $row[“password”] == crypt($_POST[“passwort”], “$5$rounds=5000$”.$row[“salt”].”$")
2.4.1. wenn ja, login erfolgreich
2.4.2. wenn nicht, falsches Passwort, dann kannst du “UPDATE SET wrong_tries = wrong_tries+1 WHERE …” machen

PS: Falls du generateSalt() benöntigst, kann ich dir den Code senden…

[edit]

function generateSalt($length=20, $specialchars=false) { $chars = $specialchars ? "!.,#*1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" : "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; $result = ""; $cnt_chars = strlen($chars); for($i = 0; $i < $length; $i++) { $result .= $chars[mt_rand(0, $cnt_chars-1)]; } return $result ; }
[edit]

[edit2]mysqli statt mysql verwenden[/edit2]

Vielen Dank für diese zweite Antwort.
Ich glaube, dass ich dadurch nun ein genügend sicheres registrier und loginformular erstellen kann. Es ist das erste Mal, dass ich soetwas versuche, aber nun hoffe ich, dass ich dadurch genug gelernt habe, um das selbe öfters zu machen. :slight_smile:

MFG

Sebastian Unger