Lorsqu'un utilisateur abonna à ma newsletter via leur adresse e-mail, à l'aide de PHP, comment puis-je leur envoyer un "lien d'activation" par courrier électronique pour confirmer que c'est leur adresse e-mail et non un faux.
Donc, au moment où j'ai p>
php: p> Je suppose que je changerais le corps $ à ceci: p> $body = "Please click the link to activate your email \n
http://www.activationlink.com?";
7 Réponses :
Insérez l'utilisateur dans une table avec un jeu d'indicateur «en attente» (ou un drapeau «validé» non défini). Ils ne devraient pas être capables de faire quoi que ce soit avant que le drapeau soit changé. Si vous voulez être vraiment minutieux, mettez-les en train de les mettre dans une table users_temp. Générez une clé totalement aléatoire et associez-la avec leur ID utilisateur. Le lien que vous avez envoyé par courrier électronique doit être http://yourwebsite.com/?activate=totallrandomkeyGeneratearlier code>. Lorsque vous obtenez une demande d'activation, activez l'indicateur valide de l'utilisateur avec la clé aléatoire correspondante. P>
Si vous envoyez des courriels lorsque le compte a été activé, envisagez de supprimer l'ID après l'activation ou de la vérification s'il a été activé précédemment. J'ai eu un système où appeler le lien d'activation déclencherait toujours un courrier électronique et qu'un utilisateur a eu l'URL ouvert dans un onglet Navigateur pendant des jours. Chaque fois qu'il redémarre son navigateur et que les onglets ont été restaurés, il recevrait une nouvelle confirmation d'activation.
Ce que j'aime faire est: p>
génère un identifiant unique unique et aléatoire dans le processus d'enregistrement P> li>
Stockez l'ID avec l'adresse e-mail, un champ "confirmé" (défaut ":" Non ") et des données supplémentaires dans une table de base de données P> li>
Envoyez l'e-mail avec une URL pointant pour activer l'identifiant unique (E.G. La page d'activation vérifie si la clé unique existe et change le champ code> confirmé code> sur En outre et éventuellement, enregistrez la date / heure de confirmation, l'adresse IP et l'agent utilisateur. P> li>
ul> domain.com/activate.php?id=102939505595 CODE> P> LI>
oui code> (ou
1 code> ou autre). p> li>
PEKKA Vous êtes génial;) thats la vraie définition.
Personnellement, j'ajouterais des détails à la base de données et j'ai des champs appelés "actifs", puis lorsqu'ils cliquent sur le lien d'activation Tout ce que vous avez à faire est de mettre à jour ce champ. p>
Vous pouvez également avoir un lien "Ce n'était pas moi" dans l'e-mail et si elles cliquent sur ceci, vous supprimez tout ce qu'il y a des détails. P>
idée intéressante à ce sujet n'était pas moi
Générez une pièce d'identité unique et stockez ceci avec le nom d'utilisateur / mot de passe dans une entrée de base de données temporaire pour le nouvel utilisateur.
$body = "Please click the link to activate your email \n http://www.activationlink.com/activateAccount?activate=".$tmpID;
Cela peut être ouvert à l'attaque, car UNIQID () est prévisible. Assurez-vous d'utiliser le drapeau plus_ -entropy au moins.
Je suis d'accord, le drapeau plus_tropy i> le rend plus sécurisé. Mais de toute façon, si vous n'avez pas accès direct au serveur, il sera assez difficile de déterminer l'heure exacte! (Depuis uniquide () est basé sur les microsecondes de l'heure actuelle !!). Donc, si aucun accès direct n'est possible, l'attaquant doit essayer beaucoup de clés afin de trouver le bon. Ainsi, une limitation du nombre d'essais d'activation autorisées pour le compte serait probablement suffisant pour prévenir une attaque et devrait généralement être considérée comme une bonne pratique.
Tout d'abord, vous devrez ajouter une colonne à votre table de base de données qui contient les utilisateurs p>
La colonne doit être appelée Lorsque vous enregistrez l'utilisateur, vous devez insérer l'utilisateur à la base de données, mais définissez le Dans votre modèle de messagerie Ajoutez le lien de l'utilisateur à activer, tel que: P>
Puis dans votre fichier de registre ou où vous avez indiqué le lien d'activation pour, obtenez simplement l'utilisateur_id et le hachage d'activation via S'ils ne correspondent pas, demandez à l'utilisateur d'entrer son mot de passe pour envoyer un autre hachage d'activation. Sinon, définissez la colonne C'est essentiellement. P> active code> et
activation_hash code> p>
actif code> sur 0 et l'activation_hash code> devient un peu de md5 aléatoire de l'utilisateur e-mail_address, first_name, etc. Avec un
unique_id () code> là, assurez-vous que c'est au format MD5, puis rangez-le dans la colonne
activation_hash code>. P>
Activez votre compte code> p>
$ € € (code> et validez-vous contre votre DB. P>
active code> sur 1 afin que le reste de votre application sait le statut de l'utilisateur. p>
Vous devriez hacher contre une valeur aléatoire sur simplement un identifiant unique. Si le lien inclut l'ID utilisateur, vous n'en avez pas besoin d'être unique et que le hachage MD5 garantit qu'il n'est pas unique de toute façon. Il serait préférable de hacher contre une valeur aléatoire ou d'utiliser simplement une valeur aléatoire sans le hachage.
Était-ce ciblé à mon poste ou c'était juste des informations supplémentaires, dans l'affirmative, j'ai expliqué que le dispositif doit être constitué d'une gamme de données uniques à cet utilisateur aussi bien que certains UNIQE_ID ();
Il est important de souligner la différence entre unique et aléatoire. Une clé aléatoire de la longueur suffisante serait préférée sur une unique.
@Marcus, votre droite, je devrais aller dans un peu plus de profondeur.
Aucune base de données requise. Vous pouvez envoyer toutes les données dans le lien hypertexte signé par hash
J'ai répondu à une question similaire récemment même avec l'expiration. ensemble de jeton entier ressemble à un nombre hexdécimal unique et il serait difficile de deviner que c'est la signification. P > lors de la réception juste divisé et décodez-le.
Bien que c'était pour le lien de récupération de mot de passe, mais idée est la même idem p>
Soigné, imo. P> p>
Vous aurez toujours besoin de stocker si l'utilisateur est activé ou non. Cependant, comme indiqué, vous n'avez pas besoin de stocker un hachage.
@Marcus Vous pouvez créer un compte d'utilisateur à l'heure à laquelle elle est activée. c'est tout
C'est une idée soignée et définitivement peu d'entretien. L'implication est que le hachage est complètement basé sur les données fournies par l'utilisateur, il aurait donc besoin d'être haché contre une clé secrète afin d'éviter les abus ou, vous avez dit signé, donc peut-être un algorithme asymétrique.
Ou même plus facilement: utilisez votre clé AES pour chiffrer l'adresse e-mail des utilisateurs et l'utiliser comme URL-paramètre (quelque chose comme: serveurName / activate.php? Adresse = {email} & activationID = {Crypy Ted Email}). Lorsque vous manipulez la demande, essayez simplement de décrypter $ _GET ['ActivationID'] et de le comparer à $ _GET ['Email']. C'est probablement l'une des approches les plus sûres et aucune information n'a besoin d'être stockée sur le serveur, à l'exception de la clé AES.
@Marcus ouais Certains sel doivent être ajoutés.
Voici mon scénario de solution complète: Ajouter une page d'inscription Ajoutez le formulaire suivant: P> <?php
$token = $_REQUEST['token'];
date_default_timezone_set('America/New_York');
$current_time = date('Y-m-d H:i:s');
$sql = "SELECT * FROM users WHERE token='$token' AND maxtime >'$current_time' AND verified=0";
$result = mysqli_query($conn, $sql);
$notverified = mysqli_num_rows($result);
if ($notverified)
{
$sql = "update signup set verified=1 where token='$token'";
$result = mysqli_query($conn, $sql);
if ($result)
{
echo 'Email verified';
}
else
{
echo 'Error';
}
}
else
{
echo 'Link expired';
}
?>
Dupliqué possible de génération de code de confirmation pour une confirmation de courrier électronique
@Gordon: PAS UNE DUP, une question liée ne demande que de générer des nombres aléatoires. Celui-ci a posé une question sur toute la procédure d'un niveau supérieur.
@Borealid Oui DUP. L'organe de la question et les réponses combinées contiennent tout ce qu'il y a à savoir pour répondre à cette question ici.