Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да изтеглите подправена парола от базата данни и потребителя за удостоверяване?

Често разработчиците се борят с проверката на парола за вход, защото не са сигурни как да се справят със съхранения хеш на паролата. Те знаят, че паролата трябва да бъде хеширана с подходяща функция като password_hash( ) и ги съхранявайте в varchar(255) поле:

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

Във формата за вход не можем да проверим паролата директно с SQL, нито можем да я търсим, защото съхранените хешове са осолени. Вместо това ние...

  1. трябва да прочетете хеша на паролата от базата данни, като търсите по потребителския идентификатор
  2. и след това може да провери паролата за вход спрямо намерения хеш с password_verify() функция.

По-долу можете да намерите примерен код, който показва как да направите проверка на паролата с mysqli Връзка. Кодът няма проверка на грешки, за да бъде четим:

/**
 * 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);
}

Обърнете внимание, че примерът използва подготвени изрази, за да избегне SQL инжекцията, екранирането не е необходимо в такъв случай. Еквивалентен пример за четене от pdo връзката може да изглежда така:

/**
 * 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);
}



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DONTs и DONTs за индекси

  2. INSERT ... НА ДУБЛИКАТ КЛЮЧ (не правете нищо)

  3. Изисква се за присъединяване на 2 маси с техните FK в 3-та маса

  4. MySQL - Как да сумираме пъти?

  5. Как да предоставим разрешения за отдалечен достъп до mysql сървър за потребител?