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();
?>
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!
Stellungnahme:Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn