Titel. Es besteht die Überprüfung des Benutzernamens, die ich getestet habe. Ich habe einige Trimm-/Stripping-Tags verwendet, um SQL-Injektionen zu vermeiden. Aber im Moment ist der einzige Teil von Interesse, dass password_hash und password_verify die Prüfung jedes Mal nicht bestehen.password_verify gibt immer false zurück
Datenbank-Passwort-Feld ist BLOB, aber ich versuchte VARCHAR 255 und CHAR 255 auch.
Relevante Login Überprüfung:
if(isset($_POST["login"])){
$username = trim($_POST['username']);
$username = strip_tags($username);
$username = htmlspecialchars($username);
$loginpassword = trim($_POST['password']);
$loginpassword = strip_tags($loginpassword);
$loginpassword = htmlspecialchars($loginpassword);
$loginQuery= "SELECT * FROM members where username='$username'";
$result = mysqli_query($conn, $loginQuery);
$row = mysqli_fetch_assoc($result);
$hash = $row['password'];
if(password_verify($loginpassword, $hash)){
$_SESSION['username'] = $username;
header("Location: index.php");
}
else{
$loginErrorExists= TRUE;
}
}
Relevante Registrierungscode:
if(isset($_POST["register"])){
$username = trim($_POST['username']);
$username = strip_tags($username);
$username = htmlspecialchars($username);
$password = trim($_POST['password']);
$password = strip_tags($username);
$password = htmlspecialchars($username);
$email = trim($_POST['email']);
$email = strip_tags($email);
$email = htmlspecialchars($email);
$conflictUserQuery = "SELECT username FROM members WHERE username='$username'";
$conflictUserResult = mysqli_query($conn, $conflictUserQuery);
$conflictUserRow = mysqli_fetch_array($conflictUserResult, MYSQLI_ASSOC);
$conflictMailQuery = "SELECT email FROM members WHERE email='$email'";
$conflictMailResult = mysqli_query($conn, $conflictMailQuery);
$conflictMailRow = mysqli_fetch_array($conflictMailResult, MYSQLI_ASSOC);
if(mysqli_num_rows($conflictUserResult) ==1){
$userConflictExists = TRUE;
}
elseif(mysqli_num_rows($conflictMailResult) ==1){
$mailConflictExists = TRUE;
}
else{
$hash = password_hash($password, PASSWORD_DEFAULT);
$registerQuery = mysqli_query($conn, "INSERT INTO members (username, password, email) VALUES ('$username', '$hash', '$email')");
if($registerQuery){
$_SESSION['username']= $username;
header("Location: index.php");
}
}
}
Trimm- und Stripping-Tags schützen Sie nicht vor sql-Injektion. Sie sollten vorbereitete und parametrisierte Abfragen verwenden. Mysqli unterstützt es .. – JimL
Trimmen/Strippen ist kaum genug, um SQL-Injektionen zu vermeiden. Nicht, dass es für den Missbrauch von password_hash relevant ist. Einige Datenbankauszüge/Eingabe/Ausgabe-Beispiele wären stattdessen nützlich. – mario
Sie können eine Authentifizierungsbibliothek verwenden, die Art, wie Sie codieren, ist nicht sicher, überprüfen Sie dies: https://stackoverflow.com/questions/549/the-definitive-guide-to-form-based-website-authentication –