2016-07-11 2 views
1

Dies ist meine erste Testversion für die Implementierung einer Mitgliederseite mit gesalzenen Passwörtern, die alle in der DB (MySQL) gespeichert sind. Alles funktioniert bis auf den Fehler auf der Seite "Login für Mitglieder".Wie kann ich ein gesalzenes Passwort von der Datenbank und vom Benutzer zurückziehen?

Der Fehler: Mitglied Login-Seite akzeptiert einen Eintrag auf die Mitgliedschaft Website und aus irgendeinem Grund für meine Überprüfung bestanden $result === false

Dies ist für die Überprüfung der Code, wenn Mitglied vorhanden ist, lassen Sie es mich wissen, was das Problem ist:

$servername = 'localhost'; 
$username = 'root'; 
$pwd = ''; 
$dbname = 'lp001'; 

$connect = new mysqli($servername,$username,$pwd,$dbname); 

if ($connect->connect_error){ 
    die('connection failed, reason: '.$connect->connect_error); 
} 


$name = mysqli_real_escape_string($connect, $_POST['name']); 
$password = mysqli_real_escape_string($connect, $_POST['password']); 
$saltQuery = "SELECT salt FROM users WHERE name = '$name';"; 
$result = mysqli_query($connect, $saltQuery); 
if ($result === false){ 
    die(mysqli_error()); 
} 
$row = mysqli_fetch_assoc($result); 
$salt = $row['salt']; 

$saltedPW = $password.$salt; 
$hashedPW = hash('sha256', $saltedPW); 
$sqlQuery = "SELECT * FROM users WHERE name = '$name' AND password = '$hashedPW'"; 

if (mysqli_query($connect, $sqlQuery)){ 
    echo '<h1>Welcome to the member site '.$name.'</h1>'; 
}else{ 
    echo 'error adding the query: '.$sql_q.'<br> Reason: '.mysqli_error($connect); 
} 
+0

des Sehen es fast Turnkey für Sie, der Login-Bereich, mit 'password_verify()' hier: http://stackoverflow.com/a/33665819. Es enthält Session-, Fehler-Reporting und try/catch – Drew

+0

Die SHA-* Algorithmen sind nicht sicher, Passwörter zu speichern, stattdessen verwenden Sie die Funktion [password_hash()] (http://www.php.net/manual/en/function). password-hash.php), um einen sicheren BCrypt-Hash zu generieren. Es wird es unnötig machen, das Salz getrennt zu lagern, siehe [Antwort] (http://stackoverflow.com/a/27094183/575765). – martinstoeckli

+0

@martintinsoeckli - danke, wenn du es als Code schreiben kannst, ich werde es als Antwort, die mir und anderen in der Zukunft helfen würde, thx wieder knospen. – clusterBuddy

Antwort

2

Oft Entwickler kämpfen mit der Verifizierung eines Login-Passwort, weil sie nicht sicher sind, wie zu behandeln e der gespeicherte Passwort-Hash. Sie wissen, dass das Passwort sollte wie password_hash() mit einer entsprechenden Funktion gehasht wird, und speichern sie in einem varchar(255) Feld:

// Hash a new password for storing in the database. 
// The function automatically generates a cryptographically safe salt. 
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT); 

In dem Login-Formular, können wir das Passwort direkt mit SQL nicht überprüfen, noch können wir danach suchen , weil die gespeicherten Hashes gesalzen sind. Stattdessen wir ...

  1. haben den Passwort-Hash aus der Datenbank lesen, durch den Benutzer-ID Benutzer
  2. und danach kann mit der Funktion password_verify() das Login-Passwort gegen die gefunden Hash überprüfen.

Im folgenden finden Sie einige Beispiel-Code zu finden, das zeigt, wie mit einem Mysqli Verbindung Passwortüberprüfung zu tun. Der Code keinen Fehler hat zu überprüfen, es lesbar zu machen:

/** 
* mysqli example for a login with a stored password-hash 
*/ 
$mysqli = new mysqli($dbHost, $dbUser, $dbPassword, $dbName); 
$mysqli->set_charset('utf8'); 

// Find the stored password hash in the db, searching by username 
$sql = 'SELECT password FROM users WHERE username = ?'; 
$stmt = $mysqli->prepare($sql); 
$stmt->bind_param('s', $_POST['username']); // it is safe to pass the user input unescaped 
$stmt->execute(); 

// If this user exists, fetch the password-hash and check it 
$isPasswordCorrect = false; 
$stmt->bind_result($hashFromDb); 
if ($stmt->fetch() === true) 
{ 
    // Check whether the entered password matches the stored hash. 
    // The salt and the cost factor will be extracted from $hashFromDb. 
    $isPasswordCorrect = password_verify($_POST['password'], $hashFromDb); 
} 

Beachten Sie, dass das Beispiel vorbereitete Anweisungen verwendet SQL-Injektion zu vermeiden, ist Entkommen notwendig, nicht in diesem Fall. Ein äquivalentes Beispiel aus einem gU lesen Verbindung könnte wie folgt aussehen:

/** 
* pdo example for a login with a stored password-hash 
*/ 
$dsn = "mysql:host=$dbHost;dbname=$dbName;charset=utf8"; 
$pdo = new PDO($dsn, $dbUser, $dbPassword); 

// Find the stored password hash in the db, searching by username 
$sql = 'SELECT password FROM users WHERE username = ?'; 
$stmt = $pdo->prepare($sql); 
$stmt->bindValue(1, $_POST['username'], PDO::PARAM_STR); // it is safe to pass the user input unescaped 
$stmt->execute(); 

// If this user exists, fetch the password hash and check it 
$isPasswordCorrect = false; 
if (($row = $stmt->fetch(PDO::FETCH_ASSOC)) !== false) 
{ 
    $hashFromDb = $row['password']; 

    // Check whether the entered password matches the stored hash. 
    // The salt and the cost factor will be extracted from $hashFromDb. 
    $isPasswordCorrect = password_verify($_POST['password'], $hashFromDb); 
} 
Verwandte Themen