PHP: Sichere Seiten nur für Mitglieder mit einem Login-System
Herausforderungen mit dem bereitgestellten Code
Der bereitgestellte PHP-Code stößt auf mehrere Probleme, die ihn behindern Funktionalität:
-
Abruf von Abfrageergebnissen: Anstatt zu verwenden $data1 = $conn->query($sql1);, der richtige Ansatz ist die Verwendung von $data = mysqli_fetch_array($conn->query($sql1)); oder $data = $conn->query($sql1)->fetch_array(); um die Abfrageergebnisse abzurufen.
-
Datenbankverbindung und -ausführung: Die Verbindung zur Datenbank sollte mit $total = $data = 0; bevor Sie Abfragen ausführen.
-
MySQLi-Syntax: Die Abfrage zum Einfügen des Tokens sollte Backticks () um Tabellen- und Spaltennamen verwenden (INSERT INTO tokens (tk, gauth) VALUES (?,? )`) anstelle von einfachen Anführungszeichen.
-
Benutzerauthentifizierung: Die Authentifizierungslogik sollte das Ergebnis der Abfrage zurückgeben, anstatt sich auf boolesche Werte zu verlassen ($result = $conn->query($sql3)->fetch_array();).
-
Token-Generierung : Die vorhandene Methode zur Token-Generierung ist nicht sicher, da sie openssl_random_pseudo_bytes() verwendet. Stattdessen sollte der Code einen kryptografisch sicheren Zufallszahlengenerator (CSPRNG) wie random_bytes() verwenden.
Vorgeschlagene Lösung
-
Datenbankoperationen vereinfachen: Verwenden Sie eine einzige Abfrage, um Benutzerinformationen abzurufen und Anmeldeinformationen zu überprüfen.
-
Vorbereitet verwenden Anweisungen: Binden Sie Parameter, um SQL-Injection-Schwachstellen zu verhindern.
-
Token sicher generieren: Verwenden Sie random_bytes() oder eine ähnliche Funktion für die sichere Token-Generierung.
-
Authentifizierungsdaten in Sitzung speichern: Speichern Sie das Authentifizierungstoken in einer Sitzungsvariablen statt in einer Cookie.
-
Token validieren: Führen Sie eine Datenbankabfrage anhand der Tokentabelle durch, um das bereitgestellte Token zu validieren.
Verbesserter Code
Das Folgende Der überarbeitete Code behebt die identifizierten Probleme und bietet ein sichereres Login-System nur für Mitglieder:
<?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();
?>
Nach dem Login kopieren
Das obige ist der detaillierte Inhalt vonWie implementiert man ein Seiten-Login-System nur für Mitglieder sicher in PHP?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!