Rumah >pembangunan bahagian belakang >tutorial php >Mengapa Tapak Ahli Saya Memintas Semakan Kata Laluan Walaupun Kata Laluan Masin Digunakan?

Mengapa Tapak Ahli Saya Memintas Semakan Kata Laluan Walaupun Kata Laluan Masin Digunakan?

Patricia Arquette
Patricia Arquetteasal
2024-11-18 21:47:02739semak imbas

Why Does My Member Site Bypass Password Checks Even When Salted Passwords Are Used?

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:

  1. Dapatkan kembali Cincang Masin daripada Pangkalan Data: Jalankan pertanyaan untuk mengambil cincang kata laluan (yang termasuk garam) yang sepadan kepada nama pengguna yang disediakan.
  2. Bandingkan Kata Laluan yang Dimasukkan dengan Cincang Masin: Gunakan fungsi password_verify(), yang secara automatik mengekstrak faktor garam dan kos daripada cincang, untuk menilai ketulenan kata laluan yang dimasukkan berbanding cincang yang disimpan.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn