Maison >développement back-end >tutoriel php >Comment puis-je implémenter une fonctionnalité sécurisée « Se souvenir de moi » à l'aide de PHP et des cookies ?

Comment puis-je implémenter une fonctionnalité sécurisée « Se souvenir de moi » à l'aide de PHP et des cookies ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-11 00:26:02694parcourir

How can I implement a secure

Système de connexion PHP : Remember Me (cookie persistant)

Introduction

La mise en œuvre d'une fonctionnalité "Se souvenir de moi" permet aux utilisateurs rester connecté même après avoir fermé son navigateur. Cette fonctionnalité améliore le confort de l'utilisateur et améliore l'expérience utilisateur globale. Dans cet article, nous examinerons un moyen sécurisé de stocker et de vérifier les cookies dans le navigateur d'un utilisateur pour un mécanisme de connexion persistant.

Stockage des cookies en toute sécurité

Pour sécuriser stockons un cookie, nous utilisons une table séparée dans la base de données :

CREATE TABLE `auth_tokens` (
    `id` integer(11) not null UNSIGNED AUTO_INCREMENT,
    `selector` char(12),
    `token` char(64),
    `userid` integer(11) not null UNSIGNED,
    `expires` datetime,
    PRIMARY KEY (`id`)
);

Processus après la journalisation Dans

Une fois la connexion réussie avec l'option "Se souvenir de moi" activée :

  • Générez un sélecteur de 12 caractères (par exemple, en utilisant base64_encode(random_bytes(9))).
  • Générer un authentificateur de 33 octets (par exemple, en utilisant random_bytes(33)).
  • Définissez un cookie avec les valeurs suivantes :

    'remember': $selector.':'.base64_encode($authenticator)
  • Stockez le sélecteur, l'authentificateur haché, l'ID utilisateur et la date d'expiration dans le Table de base de données auth_tokens.

Ré-authentification sur la page Charger

Pour réauthentifier l'utilisateur :

if (empty($_SESSION['userid']) && !empty($_COOKIE['remember'])) {
    list($selector, $authenticator) = explode(':', $_COOKIE['remember']);

    $row = $database->selectRow(
        "SELECT * FROM auth_tokens WHERE selector = ?",
        [
            $selector
        ]
    );

    if (hash_equals($row['token'], hash('sha256', base64_decode($authenticator)))) {
        $_SESSION['userid'] = $row['userid'];
        // Regenerate login token and update database
    }
}

Détails de l'approche

  • Résistance aux collisions : L'utilisation de 9 octets pour le sélecteur fournit 72 bits d'espace de clé, garantissant une collision suffisante résistance.
  • Protection contre l'usurpation d'identité : Le stockage d'un authentifiant haché dans la base de données atténue les risques d'usurpation d'identité.
  • Contre-mesures contre les attaques par timing : Hachage de la valeur de l'authentificateur avant comparaison et séparer le sélecteur de l'authentificateur évite les fuites de synchronisation.
  • Base de données Sécurité : La table auth_tokens permet de supprimer et d'expirer facilement les jetons expirés, tout en préservant l'intégrité de la base de données.

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