PHP password_hash(), password_verify()
Dalam skrip pendaftaran anda, anda mencincang kata laluan menggunakan password_hash() dan menyimpannya dengan betul pangkalan data. Walau bagaimanapun, apabila mengesahkan kata laluan semasa log masuk menggunakan password_verify(), anda menghadapi ketidakpadanan.
Coretan yang anda berikan menunjukkan bahawa kata laluan yang disimpan dalam pangkalan data telah dicincang (bermula dengan "$2y$10$") , manakala kata laluan yang dimasukkan oleh pengguna adalah dalam teks biasa (rentetan(1) "1"). Masalahnya terletak pada cara anda mendapatkan semula kata laluan daripada pangkalan data.
Dalam skrip log masuk, anda mendapatkan semula lajur kata laluan terus daripada hasil pangkalan data tanpa sebarang pemprosesan lanjut. Walau bagaimanapun, kata laluan yang disimpan dicincang dan ia perlu dinyahcincang sebelum ia boleh dibandingkan dengan kata laluan teks biasa yang dimasukkan oleh pengguna menggunakan password_verify().
Penyelesaian:
Dalam skrip log masuk, sebelum menggunakan password_verify(), anda perlu mendapatkan semula kata laluan cincang yang disimpan daripada pangkalan data dan kemudian nyahcincang menggunakan fungsi password_hash() dengan algoritma PASSWORD_DEFAULT. Berikut ialah kod yang diperbetulkan untuk skrip log masuk:
<code class="php">// ...same code as before... $stored_hash = $row['password']; // Retrieve the stored hashed password if (password_verify($pwd, $stored_hash)) { // ...same code as before... }</code>
Pengubahsuaian ini memastikan kata laluan yang disimpan dalam pangkalan data tidak dicincang dengan betul sebelum dibandingkan dengan kata laluan teks biasa yang dimasukkan oleh pengguna, membenarkan password_verify() berfungsi dengan betul.
Atas ialah kandungan terperinci Mengapakah pengesahan kata laluan PHP gagal dengan ketidakpadanan cincang kata laluan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!