comment créer un système de connexion php sécurisé, ce qui permet de « Rester connecté » fonctionnalité?

StackOverflow https://stackoverflow.com/questions/1929340

Question

J'utilise un système de connexion simple basée sur vars SESSION. Une fois que l'utilisateur ouvre une session, une session var est définie qui indique mon script l'utilisateur doit être accepté. Je n'utilise pas var cookie sur mesure clientside.

Je voudrais offrir l'option sur l'écran de connexion qui dit: « garde-moi loggué toute la journée ». Comment peut-on faire cela de manière sécurisée?

Était-ce utile?

La solution

Première: Configurer la directive session.cookie_lifetime , que ce soit dans le php.ini, fichiers de configuration, ou via session_set_cookie_params() .

Ensuite, stocker le nom d'utilisateur et la valeur de hachage du mot de passe de la session, et de valider cette connexion sur chaque page. Tant qu'il est encore valide, ils arrivent à rester connecté.

Le général devrait garder de cookie de session expiration naturelle les choses en ordre, comme vous n'aurez pas tout le monde se connecté au milieu de leur session (si les étoiles alignées pour cela, bien sûr) s'ils le gardent actif. A défaut, cependant, je considérerais la solution de eCartoth en deuxième position, comme vous pouvez simplement ajouter une deuxième ligne à l'instruction if:

if (my_validate_user_function($_SESSION['username'],$_SESSION['passhash']) 
    && $_SESSION['deathstamp'] > time()
) {
    // user is logged in again, oh boy!
}
else {
    // send in the death robots
    header('Location: /login.php',true,302);
}

EDIT: Une chose que vous voudrez peut-être à considérer est la fixation de session et / ou le détournement de session. Afin d'éviter cela, je vous recommande un (ou les deux) de deux solutions:

  1. stocker l'adresse IP de l'utilisateur dans la session
  2. session_regenerate_id() après chaque tentative de connexion réussie.

Autres conseils

Quand vous dites « me garder connecté toute la journée », je suppose que vous dire sur cette machine spécifique uniquement, correct? Vous pouvez utiliser une table mysql de se rappeler « le temps de connexion », ou un horodatage de connexion qui ne sera plus valide s'ils choisissent de se garder connecté toute la journée. Ensuite, ajoutez un script au début de votre code qui récupère l'identifiant de l'utilisateur de la vars session. Comparer l'horodatage actuel de l'utilisateur contre les ENREGISTRÉ dernier ts valides »et si elle est passé ce moment-là, vous savez qu'ils doivent être déconnectés, au cours de laquelle vous pointez essuies la session et forcer l'utilisateur à se connecter à nouveau. Cette méthode signifie qu'ils ne seront pas effectivement enregistrés jusqu'à ce qu'ils essaient de faire quelque chose de passé ce moment-là, mais il semble que pour eux. En outre, plutôt que d'utiliser un DB mysql vous pouvez également stocker ces derniers TS valides dans une variable de session ainsi.

Ainsi, par exemple lorsque l'utilisateur se connecte d'abord avec « me garder connecté toute la journée sélectionnée »:

$_SESSION['log_me_out_at'] = strtotime(date("Y-m-d ")."23:59:59");

Ensuite, chaque fois qu'une page est accessible dans votre système:

if( $_SESSION['log_me_out_at'] < time() ){
  unset($_SESSION['user_is_accepted_in']);
}

Une option pourrait consister à mettre en place une table MySQL qui enregistre les variables de session et les associe avec des adresses IP et une expiration, mais je ne suis pas sûr de tous les détails sur la façon dont seraient mises en œuvre.

Le plus simple (mais pas recommandé) façon de faire ce que vous êtes à la recherche serait de définir un $_COOKIE avec le nom d'utilisateur et mot de passe sur l'ordinateur, que votre site sera alors vérifier lors de la utilisateur se connecte.

Pour plus de sécurité, vous serais mieux servi pour sauver un seul cookie un hachage MD5 salée des données de l'utilisateur afin de fournir un hacker potentiel moins d'informations sur les données de compte de l'utilisateur. La durée peut être réglée lorsque vous définissez le cookie; php.net dispose d'une documentation assez complète sur la façon de le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top