PHP: Selamat Halaman Ahli Sahaja dengan Sistem Log Masuk
Cabaran dengan Kod Yang Diberikan
Kod PHP yang disediakan menghadapi beberapa isu yang menghalangnya fungsi:
-
Pendapatan Pertanyaan Keputusan: Daripada menggunakan $data1 = $conn->query($sql1);, pendekatan yang betul ialah menggunakan $data = mysqli_fetch_array($conn->query($sql1)); atau $data = $conn->query($sql1)->fetch_array(); untuk mengambil hasil pertanyaan.
-
Sambungan dan Pelaksanaan Pangkalan Data: Sambungan ke pangkalan data hendaklah diwujudkan menggunakan $total = $data = 0; sebelum melaksanakan sebarang pertanyaan.
-
Sintaks MySQL: Pertanyaan untuk memasukkan token hendaklah menggunakan tanda belakang () di sekeliling nama jadual dan lajur (INSERT INTO token (tk, gauth) NILAI (?,? )`) bukannya petikan tunggal.
-
Pengguna Pengesahan: Logik pengesahan harus mengembalikan hasil pertanyaan dan bukannya bergantung pada nilai boolean ($result = $conn->query($sql3)->fetch_array();).
- Penjanaan Token: Kaedah penjanaan token sedia ada tidak selamat kerana ia menggunakan openssl_random_pseudo_bait(). Sebaliknya, kod tersebut hendaklah menggunakan penjana nombor rawak selamat secara kriptografi (CSPRNG) seperti random_bytes().
Cadangan Penyelesaian
-
Permudahkan Operasi Pangkalan Data: Gunakan satu pertanyaan untuk mendapatkan semula maklumat pengguna dan semak kelayakan.
-
Gunakan Penyata Disediakan: Ikat parameter untuk mengelakkan kerentanan suntikan SQL.
-
Jana Token Dengan Selamat: Gunakan random_bytes() atau fungsi serupa untuk penjanaan token selamat.
-
Simpan Data Pengesahan dalam Sesi: Simpan pengesahan token dalam pembolehubah sesi dan bukannya kuki.
-
Sahkan Token: Lakukan pertanyaan pangkalan data terhadap jadual token untuk mengesahkan token yang disediakan.
Kod yang Diperbaiki
Kod yang disemak berikut menangani isu yang dikenal pasti dan menyediakan log masuk halaman ahli sahaja yang lebih selamat sistem:
<?php
session_start();
error_reporting(0);
$servername = "localhost";
$username = "root20";
$password = "jjewett38";
$db = "vws";
// Create connection
$total = $data = 0;
$conn = new mysqli($servername, $username, $password, $db);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// Prepare statement for user authentication
$sql_auth = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$sql_auth->bind_param("ss", $_POST['uname'], $_POST['pss']);
$sql_auth->execute();
$result_auth = $sql_auth->get_result();
// Authenticate user
if ($result_auth->num_rows > 0) {
$user = $result_auth->fetch_assoc();
$correct = TRUE;
} else {
$correct = FALSE;
}
// Generate token
if ($correct === TRUE) {
$hex = bin2hex(random_bytes(3));
$_SESSION['auth'] = $hex;
$_SESSION['logstat'] = TRUE;
}
// Close connection
$conn->close();
?>
Salin selepas log masuk
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Sistem Log Masuk Halaman Ahli Sahaja dengan Selamat dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!