Forum-webmaster
Technique - programmation => PHP / MySQL => Message commencé par: Bluely le le 29-10-2010 a 11:44:52

Titre: Formulaire de contact (avis sur code)
Posté par: Bluely le le 29-10-2010 a 11:44:52

Bonjour,

Je suis entrain de faire un script pour l'envoi de formulaire par mail. J'aimerais avoir votre avis sur ce code. Il y a t-il des disfonctionnements, des bugs, des failles en ce qui concerne la sécurité?
En gros des conseils pour l'améliorer seraient les bienvenus.
Merci par avance



Voici mon code

Code:
<?php


$_POST['nom'] = trim($_POST['nom']);
$_POST['mail'] = trim($_POST['mail']);
$_POST['message']= trim($_POST['message']);


if (isset ($_POST['nom']) && isset($_POST['mail']) && isset($_POST['message']))
{

extract($_POST) ; // pour éviter d'écrire a chak fois $_POST
if(!empty($nom) && !empty($mail) && !empty($message) ){


if(strlen($nom) <= 2){
   print("- Le champ nom est mal rempli");
   return false;
   }
   
   
if(!preg_match("/^[\w\.-]+@[\w\.-]+\.[a-z]{2,3}$/i", $mail)){
   print("- Adresse invalide !!");
   return false;
   }



$destinataire = "monadresse@.fr";
$objet = "Réponse au formulaire";



$corpsDuMail = "Nom : $nom
eMail : $mail

Message :$message";

mail($destinataire, $objet, $corpsDuMail, "de: $mail");


echo "<center><b>Les informations ont bien été transmises.</b></center>";
}
else{
echo "<center><b>L'envoi du courriel a échoué.</b></center>";
}
}

?>


Titre: Re:Formulaire de contact (avis sur code)
Posté par: Bluely le le 29-10-2010 a 22:36:19

Oui oui c'est encore moi. J'ai vraiment besoin d'avoir un avis sur ce code.
Quelqu'un pourrait m'éclairer?
Merci beaucoup

Titre: Re:Formulaire de contact (avis sur code)
Posté par: souifi le le 30-10-2010 a 02:57:22


Code:
<?php
// Si "magic_quotes_gpc" est activé sur le serveur, on supprime les Antislash.
if(get_magic_quotes_gpc())
$_POST = stripslashes($_POST);

// On vérifie que les champs existent et ne sont pas vide.
if(isset($_POST['nom'], $_POST['mail'], $_POST['message']) && !empty($_POST['nom']) && !empty($_POST['mail']) && !empty($_POST['message'])){

// On vérifie le format de l'adresse E-mail
if(!filter_var($_POST['mail'], FILTER_VALIDATE_EMAIL))
$notice = 'Votre adresse E-mail n\'ai pas valide';

// On vérifie le nom est composé d'un minimum de 3 caractères.
if(strlen($_POST['nom']) < 3)
$notice = 'Votre nom doit contenir un minimum de 3 caractères.';

// On vérifie le corp du message est composé d'un minimum de 15 caractères.
if(strlen($_POST['message']) < 15)
$notice = 'Votre message est trop court.';

// Si on a passé les vérifications sans problemes: Envois du mail...
if(!isset($notice)){
$destinataire = $_POST['mail'];
$expediteur = "your@email.com";
$objet = "Réponse au formulaire";
$reply_to = $expediteur;

$headers = "From: $expediteur<$expediteur>\r\n";
$headers .= "Reply-To: $reply_to\r\n";
$headers .= "Content-Type: text/html; charset=utf-8\r\n";

$texte = htmlentities($_POST['nom'], ENT_QUOTES, 'utf-8') . '<br />';
$texte .= htmlentities($_POST['message'], ENT_QUOTES, 'utf-8');

// Envois du mail
if(!mail($destinataire, $objet, $texte, $headers))
$notice = 'L\'envoi du courriel a échoué.';
else
$notice = 'Votre message à bien été transmis.';
}

}
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Formulaire</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<form action="" method="post">
<input type="text" name="nom" /><br />
<input type="text" name="mail" /><br />
<textarea name="message"></textarea><br />
<input type="submit" /><br />
<p><?php echo isset($notice) ? $notice : false; ?></p>
</form>
</body>
</html>

Titre: Re:Formulaire de contact (avis sur code)
Posté par: Bluely le le 30-10-2010 a 12:52:11

Oh merci beaoucoup Souifi pour ce code. Il est déjà tout fait :) .
Mais le truc c'est que j'aimerais aussi avoir un avis sur mon code à moi. Que l'on me dise ce qui ne va pas ou ce qui manque.
Merci pour votre aide!

Titre: Re:Formulaire de contact (avis sur code)
Posté par: souifi le le 30-10-2010 a 17:33:44

-Le seul traitement que tu effectue sur tes données est trim(), cela ne protège en rien mais supprime seulement les espaces au début et fin de variable. si tu veut éviter tout code malveillant il existe plusieurs fonctions php comme htmlentities (http://php.net/manual/fr/function.htmlentities.php).
Je te conseil donc de faire par exemple:


Code:

$message = htmlentities(trim($_POST['message']), ENT_QUOTES, 'utf-8');

-Tu fait des vérification sous forme de conditions et non fonctions, donc il n'y a rien à retourner


Code:

if(strlen($nom) <= 2){
print("- Le champ nom est mal rempli");
return false; // Ligne à supprimer
}

if(!preg_match("/^[\w\.-]+@[\w\.-]+\.[a-z]{2,3}$/i", $mail)){
print("- Adresse invalide !!");
return false; // Ligne à supprimer
}

-Sinon a toi de créer tes propre fonctions de vérifications, il te restera plus que a les appeler.


Code:

function verif_lengths($string, $length){
if(strlen($string) < $length){
return false;
}else{
return true;
}
}

if(!verif_lengths($nom, 3)){
echo 'votre champ est inférieur à 3 caractères';
}


-Pour vérifier l'adresse email, il y a déjà une fonction toute faite, pas besoin d'utiliser un preg_match, utilise filter_var (http://fr.php.net/manual/fr/function.filter-var.php) avec le filtre "FILTER_VALIDATE_EMAIL"

-Au niveau de l'envoie de mail, le dernier paramètre sont les entêtes, Doc function mail() (http://fr.php.net/manual/fr/function.mail.php), chaque entête doivent être séparés par un caractère CRLF (\r\n).
moi j'utilise en principe les 3 suivants:


Code:

$entete = "From: $mail_expediteur<$mail_expediteur>\r\n Reply-To: $mail_expediteur\r\n Content-Type: text/html; charset=utf-8\r\n";


Pour finir tu indique que le mail est envoyé à la seul condition que $nom, $mail, $message existent et ne doivent pas vide.... Pourquoi avoir donc fait des vérif? valide l'envoie au client seulement après être certain que le mail soit partit.


Code:

$mail = mail($destinataire, $objet, $texte, $entetes);

if($mail){
// Si le mail a été bien envoyé
echo 'mail envoyé';
}


Suis pas douer pour les explication, je sais. J'espère que sa t'auras apporté un peu quand même.

Titre: Re:Formulaire de contact (avis sur code)
Posté par: Bluely le le 31-10-2010 a 14:16:09

Encore merci! Oui oui tu as très bien expliqué, merci pour tes conseils.

Titre: Re:Formulaire de contact (avis sur code)
Posté par: jb_gfx le le 13-11-2010 a 22:38:42

htmlspecialchars() plutôt que htmlentities(), ça évitera de convertir les caractères accentués en entitées HTML (ce qu'on ne fait plus depuis les années 90 :p).

Titre: Re:Formulaire de contact (avis sur code)
Posté par: Bluely le le 27-11-2010 a 19:02:22

Encore merci

Titre: Re:Formulaire de contact (avis sur code)
Posté par: Swatt le le 03-01-2011 a 19:32:49

Ce que les collègues ont très bien expliqué est en fait une bonne protection contre ce que nous appelons les failles XSS.

Je te dirais aussi de passer à PDO pour améliorer encore le tout ! :D


Forum-webmaster | Actionné par YaBB SE
© 2001-2003, YaBB SE Dev Team. Tous droits réservés.