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 d'utiliser $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 à la base de données : La connexion à la base de données doit être établie en utilisant $total = $data = 0 ; avant d'exécuter une requête.
- 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 doit plutôt renvoyer le résultat de la requête. de s'appuyer sur des valeurs booléennes ($result = $conn->query($sql3)->fetch_array();).
- Token Generation : la méthode de génération de jeton existante n'est pas sécurisée car il 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 les instructions préparées : lier les paramètres pour empêcher l'injection SQL. vulnérabilités.
- Générer 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 : Enregistrer le jeton d'authentification dans une variable de session au lieu d'un cookie.
- Valider les jetons : effectuer une requête de base de données sur la table des jetons pour valider le jeton fourni.
Code amélioré
Le code révisé suivant résout les problèmes identifiés et fournit un système de connexion à la page réservée aux membres plus sécurisé :
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();
?>