Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara menarik kembali kata sandi yang diasinkan dari Database dan pengguna auth?

Seringkali pengembang berjuang dengan verifikasi kata sandi masuk, karena mereka tidak yakin bagaimana menangani hash kata sandi yang disimpan. Mereka tahu bahwa kata sandi harus di-hash dengan fungsi yang sesuai seperti password_hash( ) , dan simpan di varchar(255) bidang:

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

Dalam formulir login, kami tidak dapat memverifikasi kata sandi secara langsung dengan SQL, kami juga tidak dapat mencarinya, karena hash yang disimpan telah diasinkan. Sebaliknya kita...

  1. harus membaca hash sandi dari database, mencari berdasarkan id pengguna
  2. dan setelah itu dapat memeriksa kata sandi login terhadap hash yang ditemukan dengan password_verify() fungsi.

Di bawah ini Anda dapat menemukan beberapa contoh kode, yang menunjukkan cara melakukan verifikasi kata sandi dengan mysqli koneksi. Kode tidak memiliki pemeriksaan kesalahan untuk membuatnya dapat dibaca:

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

Perhatikan bahwa contoh ini menggunakan pernyataan yang disiapkan untuk menghindari injeksi SQL, melarikan diri tidak diperlukan pada kasus ini. Contoh yang setara untuk dibaca dari pdo koneksi bisa terlihat seperti ini:

/**
 * 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. Bagaimana cara mengambil data JSON dari MySQL?

  2. Pengantar Pengelompokan dan Penjumlahan SQL

  3. Fungsi MySQL RADIANS() – Mengkonversi Dari Derajat ke Radian

  4. Pengecualian:Sudah ada DataReader terbuka yang terkait dengan Koneksi ini yang harus ditutup terlebih dahulu

  5. Bagaimana cara menyimpan nama file di database, dengan info lain saat mengunggah gambar ke server menggunakan PHP?