Cara Membezakan Antara Kata Laluan Masin dan Biasa dalam Pengesahan Pangkalan Data
Dalam pengesahan pangkalan data, menjaga kata laluan adalah penting. Satu teknik lazim melibatkan penggunaan kata laluan masin, di mana rentetan rawak (garam) dilampirkan pada kata laluan sebelum pencincangan. Ini meningkatkan keselamatan dengan menjadikannya lebih sukar untuk memecahkan kata laluan secara eksponen.
Cabaran: Mengesahkan Log Masuk Ahli
Apabila melaksanakan tapak ahli dengan kata laluan masin yang disimpan dalam MySQL, perkara biasa ralat berlaku semasa proses pengesahan log masuk. Percubaan log masuk nampaknya memintas semakan kata laluan secara salah, membenarkan akses tanpa kebenaran ke tapak.
Memeriksa Kod Masalah
Coretan kod berikut digunakan untuk mengesahkan log masuk ahli:
$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); }
Penyelesaian: Kata Laluan yang Betul Pengesahan
Isu timbul daripada menggunakan perbandingan kata laluan langsung dalam pertanyaan SQL. Memandangkan kata laluan yang disimpan telah diasinkan, kaedah ini menyalahtafsir semua percubaan log masuk sebagai sah. Untuk membetulkan ini, kami perlu melaksanakan langkah berikut:
Contoh Kod Menggunakan mysqli:
// Connect to the database $mysqli = new mysqli($servername, $username, $password, $dbname); // Initialize variables $username = mysqli_real_escape_string($mysqli, $_POST['username']); $password = mysqli_real_escape_string($mysqli, $_POST['password']); // Fetch the salted hash for the specified username $query = "SELECT password FROM users WHERE username = ?"; $stmt = $mysqli->prepare($query); $stmt->bind_param('s', $username); $stmt->execute(); $stmt->bind_result($hashedPassword); $stmt->fetch(); // Verify the entered password if (password_verify($password, $hashedPassword)) { // Login successful echo '<h1>Welcome to the member site '.$username.'</h1>'; } else { // Password did not match echo 'Invalid login credentials'; }
Atas ialah kandungan terperinci Mengapa Tapak Ahli Saya Memintas Semakan Kata Laluan Walaupun Kata Laluan Masin Digunakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!