IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Générer un lien d'activation d'un compte utilisateur par mail [PHP 5.6]


Sujet :

Langage PHP

  1. #1
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut Générer un lien d'activation d'un compte utilisateur par mail
    Bonjour,
    j'effectue une refonte du système d'inscription / activation / connexion d'utilisateurs pour un intranet en entreprise.
    J'utilise à présent 2 fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    password_hash($pass, PASSWORD_BCRYPT); // pour stocker le hash du password dans la base de donnée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    password_verify($pass, $hash); // pour vérifier le password fourni à la connexion
    Cela fonctionne bien.
    Maintenant je souhaite implémenter l'envoi par mail du lien d'activation du compte et l'envoi par mail du lien de réinitialisation du password.
    Pour le moment, l'inscription de l'utilisateur enregistre son email et le datetime de l'inscription pour gérer l'expiration du lien d'activation (3H).
    Pour le lien d'activation, j'avais pensé à hasher en sha1 l'adresse email et le datetime
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // [...] création du compte [...]
    $hash=sha1($email.$datetime);
    $lien="http://www.monsite.com/activation.php?email=".$email."&hash".$hash;
    // [...] envoi du mail [...]
    page d'activation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // [...] récupération GET de l'email et du hash [...]
    // [...] récupération dans la BDD du datetime lié à l'email [...]
    // [...] vérification que le lien n'est pas expiré [...]
    $hash=sha1($email.$datetime);
    if ($hash_recu === $hash) {
        // activation du compte...
    }
    Qu'en pensez-vous ?
    Du point de vue sécurité / conception... ça tiens la route ?

    Merci pour vos futures remarques !

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il vaut mieux utiliser un jeton aléatoire.

    Ici l'utilisateur malveillant peut deviner le jeton puisqu'il sait à quelle heure il fait l'inscription.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    L'utilisateur malveillant ne sait pas que j'utilise le datetime...
    Le jeton aléatoire serait à enregistrer dans l'enregistrement du compte dans la BDD ?

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    C'est un raisonnement de logiciel fermé de placer sa sécurité dans le fait que la méthode ne soit pas connue.
    La sécurité est plus grande quand elle ne peut être percée même en connaissant la méthode.

    Ton malveillant peut faire une inscription réelle et analyser ton jeton avec un script testant différentes combinaisons et découvrir ta méthode (oui il y a des gens dont c'est la passion de découvrir ce genre de choses, ils font même des robots qui parcourent internet à la recherche de failles connues).
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    Citation Envoyé par sabotage Voir le message
    C'est un raisonnement de logiciel fermé de placer sa sécurité dans le fait que la méthode ne soit pas connue.
    La sécurité est plus grande quand elle ne peut être percée même en connaissant la méthode.
    merci pour l'explication !

    ok donc :
    1/ je génère un jeton : $token = sha1(uniqid());
    2/ j'envoie un lien avec email + jeton (les deux enregistrés dans la BDD)
    3/ l'utilisateur clic sur le lien
    4/ le script teste le couple email + token
    5/ si ok, redirection vers le formulaire complémentaire pour enregistrer un nom, prénom et mot de passe

    C'est ça ?

    même principe pour la réinitialisation du mot de passe en cas d'oubli ?

  6. #6
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    d'après mes recherches, la génération du jeton serait mieux avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $token = base64_encode(openssl_random_pseudo_bytes(32));

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Points : 383
    Points
    383
    Par défaut
    Pour ce genre de choses, t'as pas forcément besoin d'un truc aussi complexe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $token = base64_encode(openssl_random_pseudo_bytes(32));
    C'est mignon, mais faut un grand champ en base de donnée, et il faut faire attention avec les caractères spéciaux dans l'url.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $token = substr(md5(uniqid()),0 ,8);
    Ca marchera aussi bien. Ton token est généré à partir de quelque chose d'aléatoire et la durée de vie de token est assez courte.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SP-2013] Suivant le compte utilisateur, certains mails ne partent pas. Pourquoi ?
    Par Karshick dans le forum SharePoint
    Réponses: 8
    Dernier message: 01/08/2014, 19h04
  2. Active Directory - Creation compte utilisateur + mail
    Par ian13260 dans le forum VB.NET
    Réponses: 3
    Dernier message: 09/09/2010, 10h45
  3. [MySQL] Activation d'un compte utilisateur
    Par legide dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 27/06/2009, 15h18
  4. Réponses: 1
    Dernier message: 11/12/2008, 15h44
  5. Réponses: 8
    Dernier message: 08/04/2008, 11h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo