Formulaire vers courriel basique avec contrôle captcha anti spam (form to mail)

Soyez le premier à donner votre avis sur cette source.

Vue 13 881 fois - Téléchargée 2 756 fois

Description

Bonjour

Petite source qui est souvent traitée sur le forum

- Protection captcha basique
- Contrôle des champs en PHP et JS
- Une fonction PHP de contrôle de mail (la votre ou un autre snippet ...)
- Une fonction PHP pour pas se faire poster des romans et un peu de protection xss
- Protection contre le double-post, double validation (par $_SESSION).
- Bouton de reload pour le captcha.
- Contrôle javascript des champs avec alert en plus du contrôle php.

Le code est à but pédagogique pour les débutants qui cherchent une méthode de traitement
Ici un 'form To mail' mais cela peut être un formulaire pour poster des annonces ...

a++

Source / Exemple :


<?php
session_start();

function VerifierAdresseMail($mail){
$Syntaxe='#^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,6}$#';
if(preg_match($Syntaxe,$mail)){
return true;
}else{
return false;
}
}

/* PetitClean($var,$lg) */
/* $var la varible à traiter */
/* la longueur de sortie */  

function PetitClean($var,$lg){
$var=strip_tags($var);
  /* troncature on va pas me poster un roman (-: */
  if(strlen($var)>$lg){
  $var = substr($var, 0, $lg);
  $last_space = strrpos($var, " ");
  $var = substr($var, 0, $last_space);
  }else{
  $lg=0;
  } 
return $var;
}
    
$error=NULL;

if(isset($_POST['nom']) && !empty($_POST['nom'])){
$nom=$_POST['nom'];$error=NULL;
//filtrage 
$nom=PetitClean($nom,30); /*30 caractères maxi*/
}else{
echo $error='<h3 align="center">Le nom est vide - <a href="javascript:history.back();">Retour au formulaire</a></h3>';exit;
}

if(isset($_POST['mail']) && !empty($_POST['mail'])){
$mail=$_POST['mail'];$error=NULL;$mail=htmlentities($mail);
//filtrage
$mail=PetitClean($mail,60);
}else{
echo $error='<h3 align="center">Le e-mail est vide - <a href="javascript:history.back();">Retour au formulaire</a></h3>';exit;
}

if(isset($_POST['objet']) && !empty($_POST['objet'])){
$objet=$_POST['objet'];$error=NULL;
//filtrage
$objet=PetitClean($objet,100);
}else{
echo $error='<h3 align="center">L\'objet est vide - <a href="javascript:history.back();">Retour au formulaire</a></h3>';exit;
}

if(isset($_POST['message']) && !empty($_POST['message'])){
$message=$_POST['message'];$error=NULL;
//filtrage
$message=PetitClean($message,300);
}else{
echo $error='<h3 align="center">Le message est vide - <a href="javascript:history.back();">Retour au formulaire</a></h3>';exit;
}

if(VerifierAdresseMail($mail)){
//echo 'mail ok';
}else{
echo $error='<h3 align="center">Votre adresse e-mail n\'est pas valide - <a href="javascript:history.back();">Retour au formulaire</a></h3>';exit;
}

if($_SERVER['REQUEST_METHOD']==='POST' && isset($_POST['code']) && !empty($_POST['code']) && $_POST['code']===$_SESSION['verif']){ 

/*un mail, un enregistrement mysql, une ouverture de fichier ... un traitement */

$destinataire="xxxxxxxxxxxxxxx@free.fr";  /*ICI LE MAIL QUI RECEPTIONNE*/
$subject=$objet;
$body=$message;

/*format du mail*/
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/plain; charset=iso-8859-1\r\n";
/*ici on détermine l'expediteur et l'adresse de réponse*/
$headers .= "From: $nom <$mail>\r\nReply-to : $nom <$mail>\nX-Mailer:PHP";
/*tout est ok*/
    
    if (mail($destinataire,$subject,$body,$headers)){
    /*petite secu*/
    $message=NULL;
    $mail=NULL;
    $nom=NULL;
    $objet=NULL;
    $_POST=NULL;
    $_SESSION['verif']=NULL; /*anti double post*/
    $destinataire=NULL;
    echo '<h3 align="center">Votre message est envoyé, merci ! - <a href="javascript:history.back();">Retour au formulaire</a><br /></h3>';exit; 
    /* ou redirection header('Location: http://unsite.fr/merci.html');exit; ... */
    }else{
    /*petite secu*/
    $message=NULL;
    $mail=NULL;
    $nom=NULL;
    $objet=NULL;
    $_POST=NULL;
    $_SESSION['verif']=NULL;  /*anti double post*/
    $destinataire=NULL;
    echo '<h3 align="center">Désolé votre message n\'a pas pu être envoyé ! - <a href="javascript:history.back();">Retour au formulaire</a><br /></h3>';exit;
    /* ou redirection header('Location: http://unsite.fr/erreur.html');exit; ... */
    }

/*petite secu*/
$message=NULL;
$mail=NULL;
$nom=NULL;
$objet=NULL;
$_POST=NULL;
$destinataire=NULL;

} else {
echo $error='<h3 align="center">ERREUR SUR LE CODE DE SECURITE - <a href="javascript:history.back();">Retour au formulaire</a></h3>';exit;
}
?>

Conclusion :


- Ce petit bout de code est facilement adaptable à divers situation, 4 fichiers.
- Dans le zip c'est un 'form to mail' mais cela peut devenir un formulaire de login ou d'annonces ...
- Le reste est dans le zip.
- La présentation est spartiate (je sais, je suis pas un designer)
- Si vous utilisez mon code un petit mail pour le fun avec votre page.

bne prog

a++

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

inwebo
Messages postés
381
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
23 octobre 2014
-
Bonjour,

Je viens de parcourir rapidement cette source, petite indication il existe depuis la version 5.2 de PHP les fonctions sanitize/validate.

Pour plus d'information voir : http://www.php.net/manual/en/filter.filters.validate.php

Qui sera je pense plus rapide que la fonction VerifierAdresseMail()

Cordialement
cod57
Messages postés
1660
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
8 -
bonjour

@inwebo(lA REMARQUE EST JUSTE)
En effet les fonctions sanitize/validate (efficaces) existent et sont souvent oubliées.
Libre à chacun de les utiliser et de remplacer les fonctions du script.

Ce script je l'ai mis en place afin de montrer comment organiser classiquement son code, en esperant qu'il apporte une aide aux débutants. Coté securité on pourra encore le blindé.

Pour ceux qui s'intéressent à la sécurité et aux problèmes d'injections
http://www.phpsecure.info/v2/article/MailHeadersInject.php
http://www.securephpwiki.com/index.php/Email_Injection
http://www.tonyspencer.com/2005/12/15/email-injection-exploit-through-a-php-contact-form/

a++

a++
inwebo
Messages postés
381
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
23 octobre 2014
-
Bonjour,

Dernière remarque : il faut éviter de mettre <h3 align="center"> c'est déprécié !

Peut être mettre les variables, $destinataire, et la taille des variables utilisées dans la fonction petitClean dans un fichier conf, ini (voir parse_ini_file : http://php.net/manual/fr/function.parse-ini-file.php), cela permet de centraliser tout cela, c'est plus simple d'éditer un fichier que de parcourir tout le code pour le mettre à sa sauce, ce qu'un débutant ne fera sans doute pas.

Cordialement.
cod57
Messages postés
1660
Date d'inscription
dimanche 7 septembre 2008
Statut
Membre
Dernière intervention
11 septembre 2013
8 -
Bonsoir

oui un fichier ini serait le bienvenue

@inwebo : par contre h3 'deprecié' ... pourrais tu préciser

pour ceux qui veulent avec le ini : http://abyz.free.fr/form2mail/f_ini.zip
vous comprendrez le principe à vous de jouer, editer configuration.ini
je laisse la source comme avant sur phpcs, vous pouvez donc comparer les deux

a++
inwebo
Messages postés
381
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
23 octobre 2014
-
bonsoir,

Il vaut mieux mettre tout cela dans une feuille de style externe css, car pour l'instant il faut éditer directement le code php, SI tout cela est dans une feuille de style css c'est centralisé, on sépare donc bien le travail, l'affichage et le traitement.

Cordialement

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.