Formmail sécurisé

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 866 fois - Téléchargée 24 fois

Contenu du snippet

Script de formmail qui permet de recevoir un feedback des visiteurs de votre site... Le visiteur peut choisir entre plusieurs detinataire!

Source / Exemple :


<?php
 
// TITRE

echo"<h1>Contact</h1>\n";

// APPEL DES FONCTIONS

// AFFICHER

if(!$_POST)
{
	formulaire_contact($connexion, $_POST);
}

// VERIFIER/ENVOYER

elseif($_POST)
{
	// ON VERIFIE LES CHAMPS

	if(verifier_contact($_POST))
	{
		envoyer_contact($connexion, $_POST);
	}
	else
	{
		formulaire_contact($connexion, $_POST);
	}
}

// FORMULAIRE

function formulaire_contact($connexion, $_POST)
{
	// ON DEFINIT LES VALEURS PAR DEFAUT

	if(!($_POST))
	{
		$nom = 'Prénom et nom';
		$adresse = 'Adresse';
		$lieu = 'Code postal et lieu';
		$email = '@';
		$sujet = 'Sujet';
		$texte = 'Texte';
		$copie = 'on';
	}
	else
	{
		$nom = $_POST['nom'];
		$adresse = $_POST['adresse'];
		$lieu = $_POST['lieu'];
		$email = $_POST['email'];
		$sujet = $_POST['sujet'];
		$texte = $_POST['texte'];
		$texte = $_POST['copie'];
	}

	// FORMULAIRE

	echo"<h2>Formulaire</h2>\n";

	echo"<form action=\"contact.html\" method=\"post\">\n";

	echo"<p><label for=\"contact\">Contact *</label><br />\n";

	//CONTACTS

	echo"<select name=\"contact\" id=\"contact\" title=\"Contact\" tabindex=\"1\">\n";
	echo"<option selected=\"selected\">Webmaster</option>\n";

	// AUTRES DESTINATAIRES VOIRE REQUETES MYSQL POUR SELECTIONNER DES GROUPES ETC.

	echo"</select></p>\n";

	// PRENOM ET NOM

	echo"<p><label for=\"nom\">Prénom et nom *</label><br />\n";
	echo"<input type=\"text\" name=\"nom\" id=\"nom\" value=\"".$nom."\" title=\"Prénom et nom\" tabindex=\"2\" onfocus=\"this.select();\" /></p>\n";

	// ADRESSE

	echo"<p><label for=\"adresse\">Adresse</label><br />\n";
	echo"<input type=\"text\" name=\"adresse\" id=\"adresse\" value=\"".$adresse."\" title=\"Adresse\" tabindex=\"3\" onfocus=\"this.select();\" /></p>\n";

	// CODE POSTAL ET LIEU

	echo"<p><label for=\"lieu\">Code postal et lieu *</label><br />\n";
	echo"<input type=\"text\" name=\"lieu\" id=\"lieu\" value=\"".$lieu."\" title=\"Lieu\" tabindex=\"4\" onfocus=\"this.select();\" /></p>\n";

	// Email

	echo"<p><label for=\"email\">Email *</label><br />\n";
	echo"<input type=\"text\" name=\"email\" id=\"email\" value=\"".$email."\" title=\"Email\" tabindex=\"5\" onfocus=\"this.select();\" /></p>\n";

	// SUJET

	echo"<p><label for=\"sujet\">Sujet *</label><br />\n";
	echo"<input type=\"text\" name=\"sujet\" id=\"sujet\" value=\"".$sujet."\" title=\"Sujet\" tabindex=\"6\" onfocus=\"this.select();\" /></p>\n";

	// TEXTE

	echo"<p><label for=\"texte\">Texte *</label><br />\n";

	echo"<textarea name=\"texte\" id=\"texte\" cols=\"100\" rows=\"5\" title=\"Texte\" tabindex=\"7\" onfocus=\"this.select();\">".$texte."</textarea></p>\n";

	// COPIE

	echo"<p><input checked=\"checked\" type=\"checkbox\" name=\"copie\" id=\"copie\" value=\"".$copie."\" title=\"Recevoir une copie de l'email\" tabindex=\"8\" onfocus=\"this.select();\" /> <label for=\"copie\">Recevoir une copie de l'email</label></p>\n";

	// CHAMPS OBLIGATOIRES

	echo"<p>* Champs obligatoires</p>\n";

	// ENVOYER/ANNULER

	echo"<p><input type=\"submit\" value=\"Envoyer\" title=\"Envoyer\" tabindex=\"9\" /> <input type=\"reset\" value=\"Annuler\" title=\"Annuler\" tabindex=\"10\" /></p>\n";

	echo"</form>\n";
}

// VERIFIER

function verifier_contact($_POST)
{
	// VERIFICATION DES CHAINES DE CARACTERES

	function verifier_chaines($chaine)
	{
		$mauvaises_chaines = array('content-type:', 'mime-version:', 'content-transfer-encoding:', 'bcc:', 'cc:');

		foreach($mauvaises_chaines as $caracteres_inautorises)
		{
			if(strpos($chaine, $caracteres_inautorises) !== false)
			{
				return false;
			}
		}
		return true;
	}

	// ON VERIFIE LES CHAMPS

	// PRENOM ET NOM

	if(!($_POST['nom']) || $_POST['nom'] == 'Prénom et nom' ||!verifier_chaines($_POST['nom']))
	{
		$erreur = '"Prénom et nom"';
	}

	// ADRESSE

	if(!verifier_chaines($_POST['adresse']))
	{
		if(($erreur))
		{
			$erreur = ''.$erreur.', "Adresse"';
		}
		else
		{
			$erreur = ''.$erreur.'"Adresse"';
		}
	}

	// LIEU

	if(!($_POST['lieu']) || $_POST['lieu'] == 'Code postal et lieu' ||!verifier_chaines($_POST['lieu']))
	{
		if(($erreur))
		{
			$erreur = ''.$erreur.', "Code postal et lieu"';
		}
		else
		{
			$erreur = ''.$erreur.'"Code postal et lieu"';
		}
	}

	// EMAIL

	if(!($_POST['email']) || $_POST['email'] == '@' || !preg_match('/^[A-z0-9][\w\.\-]*@[A-z0-9][\w\.\-]+\.[A-z0-9]{2,6}$/', $_POST['email']) ||!verifier_chaines($_POST['email']))
	{
		if(($erreur))
		{
			$erreur = ''.$erreur.', "Email"';
		}
		else
		{
			$erreur = ''.$erreur.'"Email"';
		}
	}

	// SUJET

	if(!($_POST['sujet']) ||!verifier_chaines($_POST['sujet']))
	{
		if(($erreur))
		{
			$erreur = ''.$erreur.', "Sujet"';
		}
		else
		{
			$erreur = ''.$erreur.'"Sujet"';
		}
	}

	// TEXTE

	if(!($_POST['texte']) || $_POST['texte'] == 'Texte' ||!verifier_chaines($_POST['texte']))
	{
		if(($erreur))
		{
			$erreur = ''.$erreur.', "Texte"';
		}
		else
		{
			$erreur = ''.$erreur.'"Texte"';
		}
	}

	// SI DES CHOSES NE SONT PAS CORRECTES, ON AFFICHE UN MESSAGE D'ERREUR ET ON RETOURNE "FALSE"

	if(($erreur))
	{
		// POUR UN CHAMP INVALIDE

		if(!strrpos($erreur, ','))
		{
			echo"<p>Le champ ".$erreur." est invalide.</p>\n";
		}

		// POUR PLUSIEURS CHAMPS INVALIDES

		else
		{
			// ON REMPLACE LA DERNIERE VIRGULE PAR ET

			$nouvelle_erreur = substr_replace($erreur, ' et', strrpos($erreur,','), '1');

			// ON RETOURNE LA NOUVELLE ERREUR

			echo"<p>Les champs ".$nouvelle_erreur." sont invalides.</p>\n";
		}

		// ON RETOURNE L'ERREUR
		
		return false;
	}

	// ON ENVOIE LE MAIL

	return true;
}

// ENVOYER

function envoyer_contact($connexion, $_POST)
{
	// CHOIX DU DESTINATAIRE

	if($_POST['contact'] == 'Webmaster')
	{
		$dest = 'webmaster@tonsite.com';
	}

	else
	{
		// AUTRES DESTINATAIRES VOIRE REQUETES MYSQL POUR SELECTIONNER DES GROUPES ETC.
		
	}

	// ON PREPARE L'ENTETE

	// AVEC COPIE

	if(($_POST['copie']))
	{
		$entete = "bcc: ".$_POST['email']."\r\n";
		$entete .= "from: Ton site - ".$_POST['nom']." <".$_POST['email'].">\r\n";
	}

	// SANS COPIE

	elseif(!($_POST['copie']))
	{
		$entete = "from: Ton site - ".$_POST['nom']." <".$_POST['email'].">\r\n";
	}

	$entete .= "reply-to: ".$_POST['nom']." <".$_POST['email'].">\r\n";
	$entete .= "return-path: Tonsite - ".$_POST['nom']." <".$_POST['email'].">\r\n";
	$entete .= "mime-version: 1.0";
	$entete .= "content-type: text/plain; charset=iso-8859-1";
	$entete .= "x-mailer: php/" . phpversion();
	$entete .= "x-sender: Ton site - ".$_POST['nom']." <".$_POST['email'].">";
	$entete .= "x-auth-smtp-user: localhost";

	// PUIS LE MESSAGE

	// NOM ET PRENOM

	$message = "Prénom et nom : ".$_POST['nom']."\n\n";

	// SI IL Y A UNE ADRESSE

	if(($_POST['adresse']) && $_POST['adresse'] != 'Adresse')
	{
		$_POST['lieu'] = "".$_POST['adresse'].", ".$_POST['lieu']."";
	}

	// LIEU

	$message .= "Lieu : ".$_POST['lieu']."\n\n";

	// MESSAGE

	$message .= "Message : \n\n".$_POST['texte']."";

	// SI TOUT VA BIEN ON ENVOIE LE MAIL

	if(mail($dest, $_POST['sujet'], $message, $entete))
	{
		// MESSAGE DE CONFIRMATION

		echo"<p>Ton message a bien été envoyé.</h2>\n";

		echo"<h3>Infos détaillées</h3>\n";

		echo"<ul />\n";
		echo"<li>Contact : ".htmlentities($_POST['contact'])."</li>\n";
		echo"<li>Prénom et nom : ".htmlentities($_POST['nom'])."</li>\n";
		echo"<li>Code postal et lieu : ".htmlentities($_POST['lieu'])."</li>\n";
		echo"<li>Email : ".$_POST['email']."</li>\n";
		echo"<li>Sujet : ".htmlentities($_POST['sujet'])."</li>\n";

		// AVEC COPIE

		if(($_POST['copie']))
		{
			echo"<li><span>Copie :</span> Oui</li>\n";
		}

		// SANS COPIE

		elseif(!($_POST['copie']))
		{
			echo"<li><span>Copie :</span> Non</li>\n";
		}

		echo"</ul>\n";

		echo"<h3>Message</h3>\n";

		echo"<p>".nl2br(htmlentities($_POST['texte']))."</p>\n";

		// RETOUR

		echo"<p><a href=\"contact.html\" title=\"Retour\">Retour</a></p>\n";
	}
}

?>

Conclusion :


Il ne vous reste plus qu'à faire un design et à créer un htacces pour l'url rewriting!!

A voir également

Ajouter un commentaire Commentaires
Messages postés
1293
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015

Euh non pas forcément... pas besoin de vérifier la présence de header puisque s'il n'y a pas retour à la ligne ces derniers ne serviront à rien... .. .

function verifier_chaines($str)
{
return (strpos($str, "\n") === false &&
strpos($str, "\r") === false);
}

Par contre cette vérification ne doit pas être faite sur le corps du mail qui lui peut contenir des retour à la ligne... .. .

@ tchaOo°
Messages postés
10
Date d'inscription
mardi 25 janvier 2005
Statut
Membre
Dernière intervention
1 août 2007

Yop, merci pour ta réponse, donc il me suffit de modifier ma fonction de verification de chaîne comme suit :

// VERIFICATION DES CHAINES DE CARACTERES

function verifier_chaines($chaine)
{
$mauvaises_chaines = array('content-type:', 'mime-version:', 'content-transfer-encoding:', 'bcc:', 'cc:', '\n', '\r');

foreach($mauvaises_chaines as $caracteres_inautorises)
{
if(strpos($chaine, $caracteres_inautorises) !== false)
{
return false;
}
}
return true;
}

++
Messages postés
1293
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015

Désolé de ne pas avoir répondu avant mais j'avais zappé... .. .

Donc pour répondre à ton dernier poste... non pas vraiment... l'idée n'est pas d'enlever les caractères interdit, car ça risque de mettre le bordel dans tes header plus qu'autre chose, mais plutôt de détecter leur présence et si tu en trouve un tu affiche une erreur genre "caractère(s) interdit détecté(s)"... .. .

if(strpos( $maVar, "\n") !== false || strpos( $maVar, "\r") !== false)
// erreur
else
{
// traitement
}

@ tchaOo°
Messages postés
10
Date d'inscription
mardi 25 janvier 2005
Statut
Membre
Dernière intervention
1 août 2007

Alors? C'est mieux?

S'il vous plaît, c'est tellement important...

Merci, ++
Messages postés
10
Date d'inscription
mardi 25 janvier 2005
Statut
Membre
Dernière intervention
1 août 2007

Oups, si un admin/modérateur pouvait supprimer deux des 3 derniers commentaires identiques, merci...

(ce message aussi d'ailleurs...)
Afficher les 16 commentaires

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.