1.Problématique

Face à un phénomène grandissant qui est celui des inscriptions automatiques et autres multi-comptes, un des systèmes les plus efficaces reste à ce jour la confirmation par mail.
Vous savez, c'est le genre de message que l'on reçoit pour activer notre compte après une inscription sur un forum, site, jeu...

Pour lutter contre se fléau, nous allons créer un petit module qui enverra automatiquement un mail lors de la validation du formulaire d'inscription. Ce mail contiendra alors la procédure à suivre (un lien internet) pour finaliser l'inscription du nouveau compte.

Cet article part sur le principe que vous possédez une Base de Données (BDD) et que vous maîtrisez sa gestion.
Dans cet article, PDO sera le système pour gérer les relations avec la base de données.

2.Enjeux et choix techniques

Cet article s'adresse principalement aux Webmasters désireux de limiter les inscriptions factices et par conséquent diminuer le temps perdu à la maintenance et à la vérification de validité des données...

Avant de commencer, il nous faut quelques petits équipements :
  • La fonction Mail() pour l'envoi du Mail.
  • L'extension PDO pour les relations avec la base de données.
  • Une page validation.php (à créer).
En premier lieu et avant de faire quoi que ce soit, il nous faut rajouter deux champs à notre table "membres" :
  • Le champ cle de type varchar de taille 32 ; contiendra la clé de vérification pour l'activation du compte.
  • Le champ actif de type integer (INT ou ENTIER) ; prendra la valeur 0 d'origine et permettra de savoir si un compte est actif.

Une fois nos champs ajoutés, nous n'auront plus besoin de modifier la structure de la table membres.

Voici les tâches que l'on va accomplir pour la conception de ce module ;

Premier Temps (Ajouts à apporter sur votre page de validation de l'inscription) :
  1. Récupération du login et de l'adresse mail du prétendant.
  2. Génération aléatoire d'une clé et stockage de celle-ci dans la base de données.
  3. Envoi du mail contenant la procédure à suivre pour l'activation.
  4. Avertissement à l'utilisateur qu'un mail vient de lui être envoyé pour confirmer son inscription.

Réception du mail...

Second Temps (Sur votre nouvelle page validation.php) :
  1. Récupération de la clé correspondant au login provenant du lien du mail.
  2. Comparaison de la clé de la base de données avec celle provenant du lien du mail.
  3. Modification de la valeur du champ actif dans la base de données.
  4. Avertissement à l'utilisateur sur l'état de l'activation de son compte.
Dernier Temps (Sur votre page de connexion par exemple) :
  1. Récupération de la valeur du champ actif dans la BDD pour le login correspondant à la demande de connexion.
  2. Vérification de son état (0 ou 1).
  3. Autorise ou pas la connexion du membre en fonction de l'état du champ actif.



Pour comprendre plus en détail les opérations citées ci-dessus, les codes suivants seront commentés.

3.Code

Les codes présentés ci-dessous sont à titre d'exemples. Pour éviter toute erreur, ils ne doivent pas être Copiés/Collés. À vous d'adapter les exemples à votre situation...

I. Ajouts à apporter sur votre page de validation de l'inscription (exemple : inscriptionvalid.php)
Sélectionnez
<?php
 
//...
// Votre code
//...
// Connexion à la base de données
//...
// Vérification des données saisies par l'utilisateur
//...
// Enregistrement des données dans la base
//...	
 
// Récupération des variables nécessaires au mail de confirmation	
$email = $_POST['email'];
$login = $_POST['login'];
 
// Génération aléatoire d'une clé
$cle = md5(microtime(TRUE)*100000);
 
 
// Insertion de la clé dans la base de données  adapter en INSERT si besoin)
$stmt = $dbh->prepare("UPDATE membres SET cle=:cle WHERE login like :login");
$stmt->bindParam(':cle', $cle);
$stmt->bindParam(':login', $login);
$stmt->execute();
 
 
// Préparation du mail contenant le lien d'activation
$destinataire = $email;
$sujet = "Activer votre compte" ;
$entete = "From: inscription@votresite.com" ;
 
// Le lien d'activation est composé du login(log) et de la clé(cle)
$message = 'Bienvenue sur VotreSite,
 
Pour activer votre compte, veuillez cliquer sur le lien ci dessous
ou copier/coller dans votre navigateur internet.
 
http://votresite.com/activation.php?log='.urlencode($login).'&cle='.urlencode($cle).'
 
 
---------------
Ceci est un mail automatique, Merci de ne pas y répondre.';
 
 
mail($destinataire, $sujet, $message, $entete) ; // Envoi du mail
 
//...	
// Fermeture de la connexion	
//...
// Votre code
//...

Ces extraits de codes doivent être rajoutés sur la page contenant la vérification de la conformité des données saisies par l'utilisateur et leurs enregistrements dans la base.

Exemple de réception du mail de confirmation :
Je valide le formulaire avec entre autres les informations suivantes :

Login : mathieugut
Email : mathieugut@monmail.com

Voilà alors le mail que je vais recevoir :

Mail reçu
Sujet : Activer votre compte
Expéditeur : inscription@votresite.com

Message :
Bienvenue sur VotreSite,

Pour activer votre compte, veuillez cliquer sur le lien ci dessous ou copier/coller dans votre navigateur internet.

http://votresite.com/activation.php?log=mathieugut&cle=1e374561851a32afcd802cf5bc97b707

---------------
Ceci est un mail automatique, Merci de ne pas y répondre.


Une fois le mail reçu et le clic sur le lien, l'utilisateur se retrouve alors sur la page validation.php, c'est donc cette page qui va nous permettre d'activer le compte en fonction du résultat de la comparaison des deux clés (celle du lien du mail et celle de la base de données).

II. La page validation.php
Sélectionnez
<?php
 
//...
// Votre code
//...
// Connexion à la base de données
//...
 
 
// Récupération des variables nécessaires à l'activation
$login = $_GET['log'];
$cle = $_GET['cle'];
 
// Récupération de la clé correspondant au $login dans la base de données
$stmt = $dbh->prepare("SELECT cle,actif FROM membres WHERE login like :login ");
if($stmt->execute(array(':login' => $login)) && $row = $stmt->fetch())
  {
    $clebdd = $row['cle'];	// Récupération de la clé
    $actif = $row['actif']; // $actif contiendra alors 0 ou 1
  }
 
 
// On teste la valeur de la variable $actif récupéré dans la BDD
if($actif == '1') // Si le compte est déjà actif on prévient
  {
     echo "Votre compte est déjà actif !";
  }
else // Si ce n'est pas le cas on passe aux comparaisons
  {
     if($cle == $clebdd) // On compare nos deux clés	
       {
          // Si elles correspondent on active le compte !	
          echo "Votre compte a bien été activé !";
 
          // La requête qui va passer notre champ actif de 0 à 1
          $stmt = $dbh->prepare("UPDATE membres SET actif = 1 WHERE login like :login ");
          $stmt->bindParam(':login', $login);
          $stmt->execute();
       }
     else // Si les deux clés sont différentes on provoque une erreur...
       {
          echo "Erreur ! Votre compte ne peut être activé...";
       }
  }
 
 
//...	
// Fermeture de la connexion	
//...
// Votre code
//...


Maintenant que notre champ actif est opérationnel et à jour, il ne nous reste plus qu'à l'utiliser pour vérifier la validité d'un compte lors de la procédure de connexion de celui-ci...

III. La page de connexion (exemple:login.php)
Sélectionnez
<?php
 
//...
// Votre code
//...
// Connexion à la base de données
//...
// Récupération des données nécessaires à la connexion
//...
 
 
// Récupération des variables necessaires à la vérification du champ 'actif' de la BDD
$login = $_POST['login'];
 
// Récupération de la valeur du champ actif pour le login $login
$stmt = $dbh->prepare("SELECT actif FROM membres WHERE login like :login ");
if($stmt->execute(array(':login' => $login))  && $row = $stmt->fetch())
  {
   	$actif = $row['actif']; // $actif contiendra alors 0 ou 1
  }
 
 
// Il ne nous reste plus qu'à tester la valeur du champ 'actif' pour
// autoriser ou non le membre à se connecter
 
if($actif == '1') // Si $actif est égal à 1, on autorise la connexion
  {
   //...
   // On autorise la connexion...
   //...
  }
else // Sinon la connexion est refusé...
  {
   //...
   // On refuse la connexion et/ou on previent que ce compte n'est pas activé
   //...
  }
 
 
//...	
// Fermeture de la connexion	
//...
// Votre code
//...

Tous les noms d'objets et de variables utilisés dans cet article sont à titre d'exemples...
Veillez à bien les remplacer par vos propres noms.

4.Conclusion

Cet article touche à sa fin, sachez que les exemples de codes sont à titre d'exemples et ne peuvent fonctionner par un simple Copier/Coller.
À vous de les adapter en fonction de vos besoins...
La vérification pour la validation d'un compte à l'aide du login et d'une clé est une façon très simpliste de faire, des améliorations sont bien sûr possibles, comme l'ajout en paramètre d'un délai à respecter pour la validation, ou encore l'ajout d'un captcha pour plus de sûreté... Libre à votre imagination :)

Envoyer un mail en PHP (Excellent article d'Adrien Pellegrini sur l'utilisation de la fonction Mail() de PHP).
La FAQ PHP (pdo) (Apprendre et comprendre PDO).

5.Remerciements

Merci à Yogui et à Yoshio pour les corrections apportées à l'article.