8768 sujets

Développement web côté serveur, CMS

Bonjour,

Il manque quelque chose à mon traitement de formulaire, mais je ne sais pas quoi (je débute en php).

Je ne veux pas que le formulaire parte, tant que le champs email n'est pas renseigné.

Pouvez-vous m'aider?

Voici le code du traitement:




<?php

	$nom = $_POST['nom']; 
	$prenom = $_POST['prenom']; 
	$adresse = $_POST['adresse']; 
	$code_postal = $_POST['code_postal']; 
	$ville = $_POST['ville']; 
	$pays = $_POST['pays']; 
	$commentaire = $_POST['commentaire'];
	$mail_contact = $_POST['mail'];
	
	if(empty($mail_contact))
{
echo '<font color="red" font weight="bold">Attention! Le champs email doit être renseigné afin que nous puissions vous répondre ! Merci de le complétés en cliquant sur le lien ci-dessous.</font>';
print '<br><a href=http://www.site.com/formulaire.html>Retour à la page du formulaire</a><br/><br/><br/><br/>';
}
	
	//voici la version Mine 
	$headers = "MIME-Version: 1.0\r\n"; 
 
	//ici on détermine le mail en format texte 
	$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\r\nReply-to : <$mail_contact>\nX-Mailer [langue]HP";
	
	
	
	$subject="Message venant du site"; 
	$destinataire="monemail"; 
	$body	="Message venant de : ".$prenom." ".$nom.".\n";
	$body	.= "Habitant ".$adresse.".\n";
	$body	.= "Code postal : ".$code_postal.".\n";
	$body	.= "Ville : ".$ville.".\n";
	$body	.= "Pays : ".$pays.".\n";
	$body	.= "Le message est le suivant : ".$commentaire.".\n";

	//Envoie du mail
	mail($destinataire,$subject,$body,$headers);
	echo "<h1><center>Le mail a bien été envoyé. Retour au <a href=http://www.site.com>site</a></center></h1>"
?>

Smiley biggol
Bonjour,

Ceci :
<font color="red" font weight="bold">
fait peur... Non seulement "font" est déprécié mais en plus la balise n'est pas écrite correctement (le second "font" qui se promène).

Pour éviter d'envoyer un formulaire tant qu'un champs n'est pas remplis, il faut utiliser JS qui, côté client, fera une première vérification et empèchera d'envoyer le formulaire au serveur tant qu'il ne sera pas correct (si JS est activé, bien sûr. Le check PHP reste insispensable.

Par contre attention,
$mail_contact = $_POST['mail'];
if(empty($mail_contact))
vérifie que la variable définie en PHP est remplie. Tu ne fait auccun check sur la variable envoyée par le formulaire pour vérifier qu'elle est non nulle. Il serait préférable de mettre un
if(isset($_POST['mail'])) $mail_contact = $_POST['mail']; else erreur

Modifié par Laurie-Anne (07 Jul 2009 - 09:44)
Bonjour,

En plus des informations données ci-dessus, tu devrais également etre un peu plus strict sur le contenu des champs. Dans la situation actuelle, il est possible d'utiliser ton scripts à des fins éventuellement malicieuses en utilisants les caractères < > ", \n, etc.

Idéalement, tu dois vérifier que tous les champs ne contienne que des valeurs autorisées. Tu peux pour cela utiliser Ctype :
> http://be.php.net/manual/en/book.ctype.php

Pour empècher l'envoi du formulaire, il sera préférable que tu nous communiques le code de ton formulaire afin que nous puissions mieux te guider.

Dans ton code actuel, le mail est obligatoirement envoyé. Si tu veux éviter cela, tu dois placer l'instruction mail au sein d'un bloc else lié au test conditionnel présent.

Bonne journée,

Antoine
Je débute en php... (il faut bien passer par cette étape !)


Tout ceci n'est pas encore dans mes compétences (même si je suis le site du zero et php facile).

Mais je vais essayer de comprendre.


Merci à vous deux,
Je me renseigne sur les isset que je ne comprends pas...

A Antoine: Pour mon code formulaire, le voici:



<form method="post" action="traitement.php">
<label for="mail">Email: </label><input type="text" name="mail"/><br/><br/>
<span class="important">N'OUBLIEZ PAS D'INSCRIRE VOTRE EMAIL POUR QUE NOUS PUISSIONS VOUS REPONDRE!</span><br/><br/>
<label for="nom">Votre nom: </label><input type="text" name="nom" id="nom" maxlength="35" /><br/><br/>
<label for="prenom">Votre prénom: </label><input type="text" name="prenom"/><br/><br/>
<label for="adresse">Adresse: </label><input type="text" name="adresse"/><br/><br/>
<label for="code postal">Code postal: </label><input type="text" name="code postal"/><br/><br/>
<label for="ville">Ville: </label><input type="text" name="ville"/><br/><br/>
<label for="pays">Pays: </label><input type="text" name="pays"/><br/><br/>
<label for="commentaire">Commentaire: </label><br/><textarea name="commentaire" id="commentaire" rows="5" cols="40"/></textarea><br/><br/>1
<input type="submit" value="Envoyer">
</form>


Quelles utilisations malicieuses peut-on faire avec un formulaire?
Récupérer toutes les données à l'insu du propriétaire du site?
Détruire des informations?

Pour les caractères autorisés, je vais utiliser Ctype

Merci pour votre aide,
mailbox13630 a écrit :
Je me renseigne sur les isset que je ne comprends pas...


isset() sert à vérifier qu'une variable n'est pas déclarée ou nulle. Il retournera "true" si la/les variable(s) sont déclarées et non nulles.

Plus d'informations : http://fr.php.net/manual/fr/function.isset.php
(D'ailleurs je te recommande ce site, toute la documentation pour PHP s'y trouve, avec quelques exemples en bas de pages généralement)

edit : pour ton formulaire tu peux l'utiliser ainsi

if(isset($nom, $prenom, $mail....) === true) {
  //envoie de mail
} else {
  //message d'erreur
}

mailbox13630 a écrit :

Quelles utilisations malicieuses peut-on faire avec un formulaire?
Récupérer toutes les données à l'insu du propriétaire du site?
Détruire des informations?


Si ton formulaire interagit avec la base de données (stocker, comparer, mettre à jour, supprimer des données...) alors oui, il est fort possible qu'une personne est accès à la base de données à ton insu. Cela s'appelle "SQL injection" (wiki).
C'est pour cela qu'il faut "sanitizer" (je ne trouve plus le mot français, en gros "nettoyer") les données qu'un utilisateur tapes grâce des fonctions comme mysql_real_escape_string(), les foncitons ctype_...() ou les filtres php (filter_var() je crois). Le mieux étant de n'accepter que les données nécessaires (ie : pas d'espace pour le champ mail).
Modifié par kurt11 (10 Jul 2009 - 12:36)
Modérateur
Hello,

D'une manière génrale, ne jamais faire confiance à des données provenant d'un formaulaire remplit par un internaute.

Je te propose de regarder ceci :
(fait de tête)


//si le champ caché a une valeur ET que ce champ a bien la valeur "_envoi_ok" !
// syntaxe champ caché (à placer dans le formulaire) <input type="hidden" name="mon_champ_cache" value="_envoi_ok" /> 
if(!empty($_POST['mon_champ_cache']) && $_POST['mon_champ_cache'] == "_envoi_ok"){
    $nom = htmlspecialchars($_POST['nom']); 
    $prenom = htmlspecialchars($_POST['prenom']); 
    $adresse = htmlspecialchars($_POST['adresse']); 
    $code_postal = htmlspecialchars($_POST['code_postal']); 
    $ville = htmlspecialchars($_POST['ville']); 
    $pays = htmlspecialchars($_POST['pays']); 
    $commentaire = htmlspecialchars($_POST['commentaire']);
    $mail_contact = htmlspecialchars($_POST['mail']);
    
    //Est ce que les champs sont remplis correctement ?
    if($erreur = controlFormulaire()){
       affichageformContact($erreur);
    //sinon traitement du formulaire
    }else{
        //test envoi du mail
        if(mail($to,$sujet,$message)){
                //faire redirection (header())
                echo "ok";
        }else{
                //message erreur traitement envoi des données par mail 
                echo "ko";
        }
        
    }
//sinon retour au formulaire
}else{
    affichageformContact();
}
function controleFormulaire(){
    $erreur = array();
    $controleChamp = func_get_args();
    
    //test nom
    if(empty($controleChamp[0]))
        $erreur[] = "Veuillez remplir correctement le champ nom";
    //test prenom
    if(empty($controleChamp[1]))
        $erreur[] = "Veuillez remplir correctement le champ prénom";
    //test adresse postale
    if(empty($controleChamp[2]))
        $erreur[] = "Veuillez remplir correctement le champ adresse";
    //test CP France(à vérifier si la Regex fonctionne)
    if(!preg_match("#[\d]{5}#",$controleChamp[3]))
        $erreur[] = "Veuillez remplir correctement le champ code postale";
    //test ville
    if(empty($controleChamp[4]))
        $erreur[] = "Veuillez remplir correctement le champ ville";
    //test pays
    if(empty($controleChamp[5]))
        $erreur[] = "Veuillez remplir correctement le menu pays";
    //test commentaire 
    if(empty($controleChamp[6]))
        $erreur[] = "Veuillez remplir correctement le champ commentaire";
    if(!filter_var($controleChamp[7],FILTER_VALIDATE_EMAIL))
        $erreur[] = "Veuillez remplir correctement le champ e-mail";
    
    //test ultime
    if(!empty($erreur)){
        return $erreur;
    }
}


++
Modifié par Nolem (10 Jul 2009 - 15:01)