PHP : pages réservées aux membres sécurisées avec un système de connexion
Défis liés au code fourni
Le code PHP fourni rencontre plusieurs problèmes qui entravent son fonctionnalité :
-
Récupération des résultats de la requête : Au lieu de en utilisant $data1 = $conn->query($sql1);, l'approche correcte consiste à utiliser $data = mysqli_fetch_array($conn->query($sql1)); ou $data = $conn->query($sql1)->fetch_array(); pour récupérer les résultats de la requête.
-
Connexion et exécution de la base de données : La connexion à la base de données doit être établie en utilisant $total = $data = 0 ; avant d'exécuter des requêtes.
-
Syntaxe MySQL : La requête d'insertion du jeton doit utiliser des backticks () autour des noms de table et de colonne (INSERT INTO tokens (tk, gauth) VALUES (?,? )`) au lieu de guillemets simples.
-
Authentification de l'utilisateur : La logique d'authentification devrait renvoyer le résultat de la requête au lieu de s'appuyer sur des valeurs booléennes ($result = $conn->query($sql3)->fetch_array();).
-
Génération de jetons : La méthode de génération de token existante n'est pas sécurisée car elle utilise openssl_random_pseudo_bytes(). Au lieu de cela, le code doit utiliser un générateur de nombres aléatoires cryptographiquement sécurisé (CSPRNG) comme random_bytes().
Solution proposée
-
Simplifier les opérations de base de données : Utilisez une seule requête pour récupérer les informations utilisateur et vérifier les informations d'identification.
-
Utiliser Préparé Déclarations : liez les paramètres pour empêcher les vulnérabilités d'injection SQL.
-
Générez des jetons en toute sécurité : utilisez random_bytes() ou une fonction similaire pour la génération sécurisée de jetons.
-
Stocker les données d'authentification dans la session : enregistrez le jeton d'authentification dans une variable de session au lieu d'un cookie.
-
Valider les jetons : effectuez une requête de base de données sur la table des jetons pour valider le jeton fourni.
Code amélioré
Ce qui suit le code révisé résout les problèmes identifiés et fournit un système de connexion à la page réservée aux membres plus sécurisé :
<?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();
?>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
Déclaration:Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn