Обновление текущих паролей с помощью хэширования паролей

#php #mysql #mysqli #passwords

#php #mysql #mysqli #пароли

Вопрос:

Я пытаюсь запустить password_hash текущие password значения в моей базе данных…

 $mysqli->query("UPDATE users SET password = '" . password_hash('password', PASSWORD_DEFAULT) . "');
  

Я не получаю ошибки, но пароль не работает после обновления, как ожидалось. Единственное, о чем я могу думать, это то, что приведенный выше запрос не получает текущее значение пароля из таблицы.

Нет необходимости в подготовленных операторах, поскольку я просто копаюсь локально для этого.

Комментарии:

1. запрос не получает текущее значение пароля из таблицы Нет, как бы он получил пароль из таблицы, запустил его через функцию PHP, а затем вставил его в БД?

2. Вероятно, запустите SELECT для идентификатора и пароля, затем выполните цикл, хэш и ОБНОВИТЕ пароль по идентификатору.

3. Вы не можете смешивать PHP и SQL подобным образом. password_hash это функция PHP. Вам нужно извлечь данные в PHP, обработать их, а затем снова сохранить в MySQL. Прямо сейчас вы меняете все пароли на строку password

Ответ №1:

Вы не можете смешивать PHP и SQL подобным образом. password_hash это функция PHP. Вам нужно извлечь пользовательские данные в PHP, выполнить итерацию по ним и сохранить каждую запись в базе данных. При этом используйте транзакции SQL.

 // Remember to always enable error reporting
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$mysqli->set_charset('utf8mb4'); // always set the charset

$users = $mysqli->query('SELECT Id, password FROM users');

// start transaction and prepare a statement
$mysqli->begin_transaction();
$stmt = $mysqli->prepare('UPDATE users SET `password`=? WHERE Id=?');

foreach ($users as $user) {
    // make a hash out of the password
    $hash = password_hash($user['password'], PASSWORD_DEFAULT);
    $stmt->bind_param('ss', $hash, $user['Id']);
    $stmt->execute();
}

// commit the data to DB and end transaction
$mysqli->commit();
  

Всегда используйте подготовленные инструкции. Нет абсолютно никаких оправданий, чтобы не использовать привязку параметров! Если бы вы использовали привязку параметров с самого начала, вы бы гораздо быстрее заметили, что ваш подход ошибочен. Теперь вы изменили все пароли на строку password ; у каждой учетной записи один и тот же пароль.