Accueil > > > FORMULAIRE D'INSCRIPTION AVEC VÉRIFICATION DE L'E-MAIL PAR CODE DE CONFIRMATION
FORMULAIRE D'INSCRIPTION AVEC VÉRIFICATION DE L'E-MAIL PAR CODE DE CONFIRMATION
Information sur la source
Description
Ce script permet l'enregistrement d'utilisateurs fournissant un E-MAIL VALIDE uniquement. Pour cela il envoie en e-mail de confirmation contenant un lien sur lequel l'utilisateur doit cliquer pour confirmer son enregistrement. Afin de lutter contre le spam, toute personne recevant un e-mail de ce script peut s'enregistrer dans la liste noire afin de ne plus être importunée. Contenu du zip : - un fichier lisez-moi.txt - le script, compressé en 7z Requis : PHP et MySQL Blabla légal :) : ce script est gratuit, vous pouvez le modifier/redistribuer sous les termes du GNU General Public License publié par la Free Software Foundation, soit la version 2 de la licence, ou (à votre convenance), n'importe quelle version ultérieure (voir le fichier readme). Le code ci-dessous est mis à jour, mais l'archive contient en plus le fichier nécessaire à l'installation et un fichier exemple. La dernière MAJ (1.7) contient la correction d'une faille de sécurité... je conseille à tous ceux qui utilisent une version antérieure du script de passer à cette version.
Source
- <?php
- $serveur="http://".$_SERVER["HTTP_HOST"]; // Server root
- $validity=7; // Code validity, in days.
- $db_host="127.0.0.1"; // DB parameters
- $db_user="username";
- $db_pass="password";
- $database="db_name";
-
- //************ End of parameters
-
- $valid2=3600*24*$validity;
- $er='';
-
- if (isset($_POST["email"])) // If the form has been submitted
- {
- mysql_connect($db_host,$db_user,$db_pass) or die("Unable to connect to database");
- mysql_select_db($database) or die("Unable to select database");
-
- $page=$serveur.$_SERVER["PHP_SELF"];
- $nom=htmlentities(substr($_POST["nom"],0,100), ENT_QUOTES); // we cut the entered values to 100 characters and remove any ' or "
- $pass=htmlentities(substr($_POST["pass"],0,100), ENT_QUOTES); // this is to avoid SQL insertions (or other injections), and limit the amount of code that could be executed
- $pass2=htmlentities(substr($_POST["pass2"],0,100), ENT_QUOTES); // in case an insertion should succeed
- $email=htmlentities(substr($_POST["email"],0,100), ENT_QUOTES);
- $IP=$_SERVER['REMOTE_ADDR'];
- $heure=time();
-
- if(!eregi('^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]{2,})+$', $email))$er.='Please enter a valid e-mail address.<br/>'; // Once again, sth against email insertion
- if(false!=strpos($nom,chr(92)) || false!=strpos($nom,":") || false!=strpos($nom,",") || false!=strpos($nom,";")) $er.='You used forbidden characters in your user name.<br/>';
-
- do // The code must be unique, but we don't need to tell the user ;)
- {
- $session=md5($heure.rand(100000,999999));
- $resultat = mysql_query("SELECT * FROM w_members WHERE session ='$session'");
- }
- while(false!=($ligne = mysql_fetch_array ($resultat)));
-
- if($nom=="" || $pass=="" || $email==""){$er.='One or more fields are missing.<br/>';} // Fill in all fields, thank you
- if($pass!=$pass2){$er.='Password and confirmation didn\'t match.<br/>';} // The 2 passwords must be the same
- $resultat = mysql_query("SELECT * FROM members WHERE nom ='".$nom."'");
- if(false!=($ligne = mysql_fetch_array ($resultat))){$er.='This username ('.$nom.') is already taken.<br/>';} // If the login is already taken (confirmed)
- $resultat = mysql_query("SELECT * FROM w_members WHERE nom ='".$nom."'");
- if(false!=($ligne = mysql_fetch_array ($resultat))){$er.='This username ('.$nom.') is already taken.<br/>';} // If the login is already taken (not yet confirmed)
- $resultat = mysql_query("SELECT * FROM blackl WHERE email ='".$email."'");
- if(false!=($ligne = mysql_fetch_array ($resultat))){$er.='This e-mail ('.$email.') is blacklisted. You can\'t use it to sign up here.<br/>';} // If the e-mail is in the blacklist
-
- if($er=='')
- { //**** IF NO ERROR - START
-
- //********* Confirmation e-mail
- /* subject */
- $subject = "Account confirmation";
-
- /* message */
- $message = '
- <html>
- <head>
- <title>Account confirmation</title>
- </head>
- <body>
- Hello '.$nom.',<br/><br/>
-
- You are receiving this e-mail because you or someone else used your address to sign up on our site.<br/>
- To complete the sign-up process please follow <a href="'.$page.'?code='.$session.'">this link</a>.<br/><br/>
-
- If you didn\'t sign up on our site, just ignore this message and please accept our apologies.<br/>
- You can also choose to blacklist your e-mail so you won\'t hear from us anymore by following <a href="'.$page.'?code='.$session.'&BL=1">this link</a>.<br/>
- Your e-mail was submitted from IP '.$IP.' on '.date("r").' (server time).<br/><br/>
-
- Best regards,<br/>
- Site Admin
- </body>
- </html>
- ';
-
- /* To send HTML mail, you can set the Content-type header. */
- $headers = "MIME-Version: 1.0\r\n";
- $headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
-
- /* additional headers */
- $headers .= "To: ".$nom." <".$email.">\r\n";
- $headers .= "From: Site <do_not_reply@patheticcockroach.com>\r\n";
-
- /* and now mail it */
- if(mail($email, $subject, $message, $headers))
- {
- mysql_query("INSERT INTO w_members SET nom='".$nom."',pass='".md5($pass)."',email='".$email."',heure='".$heure."',session='".$session."',IP='".$IP."';"); // We insert the data into the waiting table
-
- echo 'Thank you.<br/>An e-mail was sent to '.$email.'. Please check your e-mail and confirm your membership within '.$validity.' days.';
- }
- else {$er.='We weren't able to send you the confirmation e-mail. Please contact the webmaster.<br/>';}
- } //**** IF NO ERROR - END
-
- mysql_close();
- } // If the form has been filled - END
-
-
- else if(isset($_GET["code"])) // If a code is entered
- {
- mysql_connect($db_host,$db_user,$db_pass) or die("Unable to connect to database");
- mysql_select_db($database) or die("Unable to select database");
-
- $heure=time();
- $heure2=$heure-$valid2; // We delete outdated codes
- mysql_query("DELETE FROM w_members WHERE heure<".$heure2.";");
-
- $session=htmlentities($_GET["code"], ENT_QUOTES);
- $sql = "SELECT * FROM w_members WHERE session ='".$session."'";
- $resultat = mysql_query($sql);
-
- if(false==($ligne = mysql_fetch_assoc ($resultat))){$er.='This code is wrong or has expired, please fill in the form again.<br/>';}
-
- if($er=='')
- { //**** IF NO ERROR - START
-
- if(!isset($_GET["BL"])) // If the user comes to confirm, we insert them into the members table and remove them from the waiting table
- {
- $nom=$ligne['nom'];
- mysql_query("INSERT INTO members SET nom='".$nom."',pass='".$ligne['pass']."',email='".$ligne['email']."',IP='".$ligne['IP']."',heure='".$ligne['heure']."';");
- mysql_query("DELETE FROM w_members WHERE session='".$session."'");
-
- echo 'Thank you for confirming your inscription '.$nom.'. You are now a member of the site.';
- }
-
- else if($_GET["BL"]==1) // If the user comes to be blacklisted, we ask for a confirmation
- {
- echo 'Click <a href="'.$_SERVER["PHP_SELF"].'?code='.$session.'&BL=2">here</a> to blacklist your e-mail. This CANNOT be undone.';
- }
-
- else // If the user confirms they want to be blacklisted, we insert them into the blacklist and remove them from the waiting table
- {
- $email=$ligne['email'];
- mysql_query("INSERT INTO blackl SET email='".$email."',IP='".$ligne['IP']."',heure='".$ligne['heure']."';");
- mysql_query("DELETE FROM w_members WHERE session='".$session."'");
-
- echo 'Your e-mail, '.$email.', has been blacklisted. You won't receive anymore e-mails from us.';
- }
- } //**** IF NO ERROR - END
-
- mysql_close();
- } // If a code is entered - END
-
-
-
- else{show_form();} // If there is no form submitted nor a code, we show the form
-
- if($er!='' && isset($_POST["email"])){show_form($nom,$pass,$pass2,$email,$er);}
- else if($er!='' && !isset($_POST["email"])){show_form('','','','',$er);}
-
- //************ Form display function
- function show_form($nom="",$pass="",$pass2="",$email="",$er='')
- {
- echo '<div style="font-weight:bold;">'.$er.'</div>
- Please fill in the sign up form :<br/>
- <form action="'.$_SERVER["PHP_SELF"].'" method="post">
- <table>
- <tr>
- <td><label for="nom">Desired login</label> :</td><td><input type="text" name="nom" id="nom" size="50" maxlength="20" value="'.$nom.'" /></td>
- </tr>
-
- <tr>
- <td><label for="pass">Password</label> :</td><td><input type="password" name="pass" id="pass" size="50" maxlength="20" value="'.$pass.'" /></td>
- </tr>
-
- <tr>
- <td><label for="pass2">Confirm password</label> :</td><td><input type="password" name="pass2" id="pass2" size="50" maxlength="20" value="'.$pass2.'" /></td>
- </tr>
-
- <tr>
- <td><label for="email">E-mail</label> :</td><td><input type="text" name="email" id="email" size="50" maxlength="100" value="'.$email.'" /></td>
- </tr>
- <tr><td colspan="2" style="text-align:center;"><input type="submit" value=" Sign Up " /></td></tr>
- </table>
- </form>';
- }
-
- ?>
<?php
$serveur="http://".$_SERVER["HTTP_HOST"]; // Server root
$validity=7; // Code validity, in days.
$db_host="127.0.0.1"; // DB parameters
$db_user="username";
$db_pass="password";
$database="db_name";
//************ End of parameters
$valid2=3600*24*$validity;
$er='';
if (isset($_POST["email"])) // If the form has been submitted
{
mysql_connect($db_host,$db_user,$db_pass) or die("Unable to connect to database");
mysql_select_db($database) or die("Unable to select database");
$page=$serveur.$_SERVER["PHP_SELF"];
$nom=htmlentities(substr($_POST["nom"],0,100), ENT_QUOTES); // we cut the entered values to 100 characters and remove any ' or "
$pass=htmlentities(substr($_POST["pass"],0,100), ENT_QUOTES); // this is to avoid SQL insertions (or other injections), and limit the amount of code that could be executed
$pass2=htmlentities(substr($_POST["pass2"],0,100), ENT_QUOTES); // in case an insertion should succeed
$email=htmlentities(substr($_POST["email"],0,100), ENT_QUOTES);
$IP=$_SERVER['REMOTE_ADDR'];
$heure=time();
if(!eregi('^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]{2,})+$', $email))$er.='Please enter a valid e-mail address.<br/>'; // Once again, sth against email insertion
if(false!=strpos($nom,chr(92)) || false!=strpos($nom,":") || false!=strpos($nom,",") || false!=strpos($nom,";")) $er.='You used forbidden characters in your user name.<br/>';
do // The code must be unique, but we don't need to tell the user ;)
{
$session=md5($heure.rand(100000,999999));
$resultat = mysql_query("SELECT * FROM w_members WHERE session ='$session'");
}
while(false!=($ligne = mysql_fetch_array ($resultat)));
if($nom=="" || $pass=="" || $email==""){$er.='One or more fields are missing.<br/>';} // Fill in all fields, thank you
if($pass!=$pass2){$er.='Password and confirmation didn\'t match.<br/>';} // The 2 passwords must be the same
$resultat = mysql_query("SELECT * FROM members WHERE nom ='".$nom."'");
if(false!=($ligne = mysql_fetch_array ($resultat))){$er.='This username ('.$nom.') is already taken.<br/>';} // If the login is already taken (confirmed)
$resultat = mysql_query("SELECT * FROM w_members WHERE nom ='".$nom."'");
if(false!=($ligne = mysql_fetch_array ($resultat))){$er.='This username ('.$nom.') is already taken.<br/>';} // If the login is already taken (not yet confirmed)
$resultat = mysql_query("SELECT * FROM blackl WHERE email ='".$email."'");
if(false!=($ligne = mysql_fetch_array ($resultat))){$er.='This e-mail ('.$email.') is blacklisted. You can\'t use it to sign up here.<br/>';} // If the e-mail is in the blacklist
if($er=='')
{ //**** IF NO ERROR - START
//********* Confirmation e-mail
/* subject */
$subject = "Account confirmation";
/* message */
$message = '
<html>
<head>
<title>Account confirmation</title>
</head>
<body>
Hello '.$nom.',<br/><br/>
You are receiving this e-mail because you or someone else used your address to sign up on our site.<br/>
To complete the sign-up process please follow <a href="'.$page.'?code='.$session.'">this link</a>.<br/><br/>
If you didn\'t sign up on our site, just ignore this message and please accept our apologies.<br/>
You can also choose to blacklist your e-mail so you won\'t hear from us anymore by following <a href="'.$page.'?code='.$session.'&BL=1">this link</a>.<br/>
Your e-mail was submitted from IP '.$IP.' on '.date("r").' (server time).<br/><br/>
Best regards,<br/>
Site Admin
</body>
</html>
';
/* To send HTML mail, you can set the Content-type header. */
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
/* additional headers */
$headers .= "To: ".$nom." <".$email.">\r\n";
$headers .= "From: Site <do_not_reply@patheticcockroach.com>\r\n";
/* and now mail it */
if(mail($email, $subject, $message, $headers))
{
mysql_query("INSERT INTO w_members SET nom='".$nom."',pass='".md5($pass)."',email='".$email."',heure='".$heure."',session='".$session."',IP='".$IP."';"); // We insert the data into the waiting table
echo 'Thank you.<br/>An e-mail was sent to '.$email.'. Please check your e-mail and confirm your membership within '.$validity.' days.';
}
else {$er.='We weren't able to send you the confirmation e-mail. Please contact the webmaster.<br/>';}
} //**** IF NO ERROR - END
mysql_close();
} // If the form has been filled - END
else if(isset($_GET["code"])) // If a code is entered
{
mysql_connect($db_host,$db_user,$db_pass) or die("Unable to connect to database");
mysql_select_db($database) or die("Unable to select database");
$heure=time();
$heure2=$heure-$valid2; // We delete outdated codes
mysql_query("DELETE FROM w_members WHERE heure<".$heure2.";");
$session=htmlentities($_GET["code"], ENT_QUOTES);
$sql = "SELECT * FROM w_members WHERE session ='".$session."'";
$resultat = mysql_query($sql);
if(false==($ligne = mysql_fetch_assoc ($resultat))){$er.='This code is wrong or has expired, please fill in the form again.<br/>';}
if($er=='')
{ //**** IF NO ERROR - START
if(!isset($_GET["BL"])) // If the user comes to confirm, we insert them into the members table and remove them from the waiting table
{
$nom=$ligne['nom'];
mysql_query("INSERT INTO members SET nom='".$nom."',pass='".$ligne['pass']."',email='".$ligne['email']."',IP='".$ligne['IP']."',heure='".$ligne['heure']."';");
mysql_query("DELETE FROM w_members WHERE session='".$session."'");
echo 'Thank you for confirming your inscription '.$nom.'. You are now a member of the site.';
}
else if($_GET["BL"]==1) // If the user comes to be blacklisted, we ask for a confirmation
{
echo 'Click <a href="'.$_SERVER["PHP_SELF"].'?code='.$session.'&BL=2">here</a> to blacklist your e-mail. This CANNOT be undone.';
}
else // If the user confirms they want to be blacklisted, we insert them into the blacklist and remove them from the waiting table
{
$email=$ligne['email'];
mysql_query("INSERT INTO blackl SET email='".$email."',IP='".$ligne['IP']."',heure='".$ligne['heure']."';");
mysql_query("DELETE FROM w_members WHERE session='".$session."'");
echo 'Your e-mail, '.$email.', has been blacklisted. You won't receive anymore e-mails from us.';
}
} //**** IF NO ERROR - END
mysql_close();
} // If a code is entered - END
else{show_form();} // If there is no form submitted nor a code, we show the form
if($er!='' && isset($_POST["email"])){show_form($nom,$pass,$pass2,$email,$er);}
else if($er!='' && !isset($_POST["email"])){show_form('','','','',$er);}
//************ Form display function
function show_form($nom="",$pass="",$pass2="",$email="",$er='')
{
echo '<div style="font-weight:bold;">'.$er.'</div>
Please fill in the sign up form :<br/>
<form action="'.$_SERVER["PHP_SELF"].'" method="post">
<table>
<tr>
<td><label for="nom">Desired login</label> :</td><td><input type="text" name="nom" id="nom" size="50" maxlength="20" value="'.$nom.'" /></td>
</tr>
<tr>
<td><label for="pass">Password</label> :</td><td><input type="password" name="pass" id="pass" size="50" maxlength="20" value="'.$pass.'" /></td>
</tr>
<tr>
<td><label for="pass2">Confirm password</label> :</td><td><input type="password" name="pass2" id="pass2" size="50" maxlength="20" value="'.$pass2.'" /></td>
</tr>
<tr>
<td><label for="email">E-mail</label> :</td><td><input type="text" name="email" id="email" size="50" maxlength="100" value="'.$email.'" /></td>
</tr>
<tr><td colspan="2" style="text-align:center;"><input type="submit" value=" Sign Up " /></td></tr>
</table>
</form>';
}
?>
Conclusion
Si vous avez des suggestions, n'hésitez pas... Au cas où j'oublie d'envoyer une MAJ ultérieure, elle est disponible ici le cas échéant : http://patheticcockroach.com/mpam4/index.php?p=21
Historique
- 25 septembre 2004 17:59:09 :
- Ajout d'un message d'erreur si problème lors de l'envoi de l'e-mail (la version précédente ne tenait pas compte du résultat de la fonction mail, oops).
- 29 octobre 2004 17:45:55 :
- En fait, j'ai pensé à un truc : enregistrer l'IP sans l'heure/la date qui vont avec, ça sert pas à grand-chose... Alors voilà, maintenant, l'heure d'inscription est enregistrée.
- 30 août 2005 08:57:40 :
- - correction de failles de sécurité (insertions SQL)
- diverses modifications mineures du code
- correction de la page exemple
- 16 septembre 2005 16:43:07 :
- MAJ de sécurité (email injection), quelques modifications du code (notamment des requêtes SQL), modification de la page d'exemple (XHTML 1.1 compliante ;) )
Sources du même auteur
Sources de la même categorie
VALIDATEUR DE FORMULAIREVALIDATEUR DE FORMULAIREJ'ai codé cet ensemble de classes pour accélérer la création de formulaire sans l'alourdir avec une classe la plus simple possible d'utilisation.
J'a...
par Reldan
SUIVI SERVICE CLIENT PHPSUIVI SERVICE CLIENT PHP Bonjour. Voici mon premier dev en PHP.
Il reste encore beaucoup de travail a faire, afin de le finir, en y incluant par exemple tout e la partie bas...
par hige52
POO - FORMULAIRE NEWSLETTER PHP - PROFESSEUR-PHP.COMPOO - FORMULAIRE NEWSLETTER PHP - PROFESSEUR-PHP.COM Il y a de nombreuses sources sur les formulaire de newsetter, je propose en plus la vidéo pour l'explication de la source, merci.
Voici le tutorial...
par mtrix000
SELECTEUR DE NOTESELECTEUR DE NOTEUne classe Php et le plugin jQuery correspondant pour un sélecteur de note simplissime d'utilisation.
Rien de bien novateur mais je n'ai pas trouvé d...
par Reldan
ESPACE MEMBRE , AVEC CASE OPTIONNEL , SANS MYSQLESPACE MEMBRE , AVEC CASE OPTIONNEL , SANS MYSQLvoici un espace membre qu'on peut qualifier de très simple, il n'utilise pas de bdd, ni mysql il est plus fait pour de petits sites, il n'y a rien d'a...
par sartoz
Commentaires et avis
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|