Aller au contenu

Créer un formulaire de contact php anti-spam (captcha)


Sujets conseillés

Posté

Bonjour,

Spammé depuis quelques jours et à répétition par l'intermédiaire de mon formulaire de contact, je souhaite intégrer un cryptograph à mon formulaire. L'installation en semble pas compliqué, mais sans succès pour ma part. L'image qui génère les codes ne s'affiche pas !

Le dossier crypt est bien sur mon serveur.

-http://www.lanature.fr/contact.php

<?php include "crypt/functions.php"; ?>
<?php
// Dans la ligne qui suit, remplacer webmaster_AT_domaine.tld par l'adresse email du webmaster, à laquelle les messages devront être envoyés
$email_webmaster = "webmaster_AT_lanature.fr";
// === traitement des données du formulaire ============================================================
if (isset($_POST["envoyer"])){
// le formulaire a été soumis
$etat = "erreur";
// Valeur par défaut. Prendra la valeur "ok" s'il n'y a pas d'erreur
// --- mise en forme des champs saisis dans le formulaire lors de sa soumission ---
if (isset($_POST["email_expediteur"])) {
$_POST["email_expediteur"]=trim(stripslashes($_POST["email_expediteur"]));
}
if (isset($_POST["titre"])) {
$_POST["titre"]=trim(stripslashes($_POST["titre"]));
}
if (isset($_POST["message"])) {
$_POST["message"]=trim(stripslashes($_POST["message"]));
}
// --- test de la validité des champs saisis ---
if (empty($_POST["email_expediteur"])) {
// il manque l'email de l'expéditeur
$erreur="Saisissez votre adresse email...";
}
elseif (!eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\.[a-z]{2,4}$",$_POST["email_expediteur"])){
// l'adresse e-mail n'est pas valide
$erreur="Votre adresse e-mail n'est pas valide...";
}
elseif (empty($_POST["message"])) {
// le message est vide
$erreur="Saisissez un message...";
}
elseif (empty($_POST["code"])) {
// le code n'est pas saisi
$erreur="Saisissez le code de verification...";
}

else {
// --- Vérification de la validité du code captcha ---
if (chk_crypt($_POST['code']))
// --- tous les champs sont correctement remplis: on pourra envoyer le mail ---
$etat="ok";
// --- Le code captcha n'est pas valide ---
else $erreur="Code de verification non valide ...";
}
}

else {
// --- le formulaire n'a pas été soumis ---
$etat="attente";
}
// === fin de traitement des données du formulaire =======================================================
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Contact nature et jardin bio</title>
<meta name="description" content="Formulaire de contact nature et jardin bio, posez vos questions sur la nature">
<meta name="Keywords" content="nature, jardin ,question nature, question jardin, contact nature">
<link href="http://www.lanature.fr/icones.ico" rel="shortcut icon">
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<div id="conteneur">
<br>

<div id="edito">
<h2 style="text-align: center;">Contact Nature et jardin
bio</h2>

<br>

Pour toutes demandes d'aides et conseils sur le thème de
la <strong>nature</strong> et du <strong>jardin</strong>,
merci<br>

d'utiliser le forum. Vous pouvez y accéder en cliquant sur <a style="color: rgb(102, 0, 204);" href="forum/"><strong>forum
nature</strong></a>.<br>

<br>

Pour me contacter, remplissez le formulaire ci-dessous.<br>

<br>

<div align="center">
<?php
if ($etat!="ok"){// le formulaire n'a pas été soumis, ou soumis avec une erreur
if ($etat=="erreur"){
//le formulaire a été soumis avec une erreur
echo "<p><strong>".$erreur."</strong></p>\n";
// afficher le message d'erreur
}
?>
<form method="post" action="<?php echo $_SERVER["PHP_SELF"]; ?>">
<p><label for="email_expediteur">Votre adresse e-mail (obligatoire):</label><br />
<input type="text" size="40" name="email_expediteur" id="email_expediteur" value="<?php
if (!empty($_POST["email_expediteur"])) {
// l'adresse email de l'expéditeur a été saisie: la réafficher
echo htmlspecialchars($_POST["email_expediteur"],ENT_QUOTES);
}
?>" />
</p>
<p><label for="titre">Titre de message (facultatif):</label><br />
<input type="text" size="40" name="titre" id="titre" value="<?php
if (!empty($_POST["titre"])) {
// le titre du message a été saisi: le réafficher
echo htmlspecialchars($_POST["titre"],ENT_QUOTES);
}
?>" />
</p>
<p><label for="message">Message (obligatoire):</label><br />
<textarea name="message" id="message" cols="40" rows="5"><?php
if (isset($_POST["message"])) {
// le message a été saisi: le réafficher
echo htmlspecialchars($_POST["message"],ENT_QUOTES);
}
?></textarea>
</p>
<?php dsp_crypt(0,1); ?>
<p><input type="text" name="code" /></p>
<p><input type="submit" name="envoyer" value="Envoyer" />
</p>
</form>
<?php
}
else {
// le formulaire a été soumis sans erreur, on envoie le mail
$entete = "From: ".$_POST["email_expediteur"]." <".$_POST["email_expediteur"].">\n";
$entete .= "MIME-Version: 1.0";
if (@mail($email_webmaster,$_POST["titre"],$_POST["message"],$entete)){
// mail envoyé
echo "Votre message a été envoyé.<br />\n";
echo "<a href=\"".$_SERVER["PHP_SELF"]."\">Envoyer un autre message...</a>\n";
}
else {
// erreur lors de l'envoi du mail
echo "Un problème s'est produit lors de l'envoi du message.\n";
echo "<a href=\"".$_SERVER["PHP_SELF"]."\">Réessayez...</a>\n";
}
}
?>
</div>

<br>

<br>

<div style="text-align: center;"><br>

<input name="button2" onclick="history.back()" value="Retour" type="button"></div>

</div>

<div style="text-align: center;" id="header"><?php include("menu.php"); ?><big><br>

<br>

<br>

<br>

<br>

</big></div>

<div style="text-align: center;" id="gauche"><?php include("gauche.php"); ?><big><br>

</big></div>

<div id="droite">
<div style="text-align: center;"><?php include("droite.php"); ?></div>

<big><br>

</big></div>

<div style="text-align: center;" id="pied"><?php include("pied.php"); ?></div>

</div>

</body>
</html>

  • Réponses 119
  • Créé
  • Dernière réponse

Contributeurs actifs dans ce sujet

Contributeurs actifs dans ce sujet

Posté

Merci,

mon serveur ne l'accepte. J'ai testé le script sur un autre hebergeur, il fonctionne impecable.

Meme avec les modifications apportées l'image reste inaffiché.

J'opte pour un autre script, qui semble fonctionner.

Posté

Bonjour à tous !

Juste une question :

Le mailer en php proposé dans ce sujet permet-il de cacher l'email quand la page est aspirée ?

Je me pose cette question car apparemment mon site a été aspiré...

PS: j'utilise aussi le captcha proposé par Byc et j'ai ajouté dans le répertoire qui contient le formulaire php un fichier index.html pour éviter d'afficher le contenu de ce même répertoire...

Posté

Il ne faut pas confondre :

- Un système de captcha empêche (théoriquement) aux robots automatisés de s'inscrire, pour qu'ils ne puissent pas spammer un forum ou un système de commentaires

- un aspirateur enregistre toutes les pages d'un site en suivant les liens (comme un moteur de recherche, mais avec un but plus ou moins avouable).

Ils ne sont pas liés : un captcha n'empêchera pas à un aspirateur de voir les adresses e-mail de ton site.

Une manière de se protéger, est de faire en sorte que les adresses e-mail ne soient pas reconnues comme telles par un robot. Sur ce forum, elles sont automatiquement transformées en adresse_AT_email.com

Posté

Là en l'occurence, meme si ton site est aspiré l'adresse email qui se trouve dans le script ne sera pas vue car elle n'apparait pas dans la source du fichier html mais seulement dans la source du fichier php. Ce script protège donc ton adresse email.

Ce que verra la personne qui a aspiré ton site, c'est ce que tu vois quant tu fais un clic droit/afficher la source lorsque tu visionnes ta page de contact.

Posté

J'ai modifié le deuxième formulaire avec le système d'addition qui est proposé sur ce fil et j'ai ajouté l'envoie de l'adresse IP ainsi que le navigateur de celui qui poste le message. Que pensez-vous du code ?

 

<?php
include_once("antispam.php");
?>

<?php
// Dans la ligne qui suit, remplacer webmaster_AT_domaine.tld par l'adresse email du webmaster, à laquelle les messages devront être envoyés
$email_webmaster = "webmaster_AT_domaine.tld ";
// Rajout alphega: Dans cette ligne remplacer example.com par le nom de votre site. Utile si vous avez plusieurs formulaires.
$titre_cache = "Depuis le site domaine.tld";
// === traitement des données du formulaire ============================================================
if (isset($_POST["envoyer"])){
// le formulaire a été soumis
$etat = "erreur";
// Valeur par défaut. Prendra la valeur "ok" s'il n'y a pas d'erreur
// --- mise en forme des champs saisis dans le formulaire lors de sa soumission ---
if (isset($_POST["email_expediteur"])) {
$_POST["email_expediteur"]=trim(stripslashes($_POST["email_expediteur"]));
}
if (isset($_POST["titre"])) {
$_POST["titre"]=trim(stripslashes($_POST["titre"]));
}
if (isset($_POST["message"])) {
$_POST["message"]=trim(stripslashes($_POST["message"]));
}
// --- test de la validité des champs saisis ---
if (empty($_POST["email_expediteur"])) {
// il manque l'email de l'expéditeur
$erreur="Saisissez votre adresse email...";
}
elseif (!eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\.[a-z]{2,4}$",$_POST["email_expediteur"])){
// l'adresse e-mail n'est pas valide
$erreur="Votre adresse e-mail n'est pas valide...";
}
elseif (empty($_POST["message"])) {
// le message est vide
$erreur="Saisissez un message...";
}
elseif (antispam_check() == false) {
// l'addition est fausse
$erreur="Résultat incorrect du calclul antispam, veuillez réessayer !";
}
else {
// --- tous les champs sont correctement remplis: on pourra envoyer le mail ---
$etat="ok";
}
}
else {
// --- le formulaire n'a pas été soumis ---
$etat="attente";
}
// === fin de traitement des données du formulaire =======================================================
?>


<?php
if ($etat!="ok"){// le formulaire n'a pas été soumis, ou soumis avec une erreur
if ($etat=="erreur"){
//le formulaire a été soumis avec une erreur
echo "<p><strong>".$erreur."</strong></p>\n";
// afficher le message d'erreur
}
?>
<form method="post" action="<?php echo $_SERVER["PHP_SELF"]; ?>">
<p><label for="email_expediteur">Votre adresse e-mail (obligatoire):</label><br />
<input type="text" size="40" name="email_expediteur" id="email_expediteur" value="<?php
if (!empty($_POST["email_expediteur"])) {
// l'adresse email de l'expéditeur a été saisie: la réafficher
echo htmlspecialchars($_POST["email_expediteur"],ENT_QUOTES);
}
?>" />
</p>
<p><label for="titre">Titre de message (facultatif):</label><br />
<input type="text" size="40" name="titre" id="titre" value="<?php
if (!empty($_POST["titre"])) {
// le titre du message a été saisi: le réafficher
echo htmlspecialchars($_POST["titre"],ENT_QUOTES);
}
?>" />
</p>
<p><label for="message">Message (obligatoire):</label><br />
<textarea name="message" id="message" cols="40" rows="5"><?php
if (isset($_POST["message"])) {
// le message a été saisi: le réafficher
echo htmlspecialchars($_POST["message"],ENT_QUOTES);
}
?></textarea>
</p>
<p>Résultat du calcul (pour éviter le spam):</p>
<?php antispam_ins(); ?>
<p><input type="submit" name="envoyer" value="Envoyer" />
</p>
</form>
<?php
}
else {
// le formulaire a été soumis sans erreur, on envoie le mail
$entete = "From: ".$_POST["email_expediteur"]." <".$_POST["email_expediteur"].">\n";
$entete .= "Return-Path: ". $email_webmaster . "\n";
$entete .= "MIME-Version: 1.0";
$message="Provenance : $HTTP_REFERER\n";
$message.="Adresse IP : $REMOTE_ADDR,\n";
$message.="Navigateur : $HTTP_USER_AGENT\n";

if (@mail($email_webmaster,$titre_cache." / ".$_POST["titre"],$message.$_POST["message"],$entete)){
// mail envoyé
echo "Votre message a été envoyé.<br />\n";
echo "<a href=\"".$_SERVER["PHP_SELF"]."\">Envoyer un autre message...</a>\n";
}
else {
// erreur lors de l'envoi du mail
echo "Un problème s'est produit lors de l'envoi du message.\n";
echo "<a href=\"".$_SERVER["PHP_SELF"]."\">Réessayez...</a>\n";
}
}
?>

Posté (modifié)

Je viens de tester ton script mais je crois qu'il y a un problème ... Il me dit chaque fois qu'il y a une erreur : "Un problème s'est produit lors de l'envoi du message. Réessayez... "

Dommage ça à l'air super :unsure:

Voici l'adresse : http://www.eretz.be/contact2.php

Modifié par Yoav
  • 3 semaines plus tard...
Posté (modifié)

Bonjour à toutes et à tous

et merci tout d'abord pour le script qui fonctionne très bien quand utilisé "tel que".

C'est quand j'essaie de la mettre à "ma sauce" que ça se complique.

J'obtiens systématiquement des erreurs. Mais pourquoi ?

Je séche depuis 2 heures (je précise que je ne connais rien au PHP) et j'ai besoin d'un (petit ?) coup de main..

Dans un 1er temps (et c'est déjà là que je bloque) je cherche à rajouter le nom de l'expéditeur et de le récupérer dans l'email qu'il va m'adresser.

J'ai donc mis ceci dans la 1ère partie :

		if (isset($_POST["nom"])) {
$_POST["nom"]=trim(stripslashes($_POST["nom"]));
}

et un peu plus bas dans cette partie toujours :

				elseif (empty($_POST["nom"])) {
// il manque le nom de l'expéditeur
$erreur="Merci de donner votre nom.";
}

Le contrôle semble bien s'effectuer.

Dans la partie html j'ai donc rajouter un champ de cette manière :

		<p><label for="nom">Votre nom (obligatoire):</label><br />
<input type="text" size="40" name="nom" id="nom" value="<?php
if (!empty($_POST["nom"])) {
// le nom de l'expéditeur a été saisi: le réafficher
echo htmlspecialchars($_POST["nom"],ENT_QUOTES);
}
?>" />
</p>

Pas de souci encore : tout s'affiche bien.

Et c'est dans cette dernière ligne que les choses se gâtent.

J'ai rajouté

$_POST["nom"]

ainsi :

// le formulaire a été soumis sans erreur, on envoie le mail
$entete = "From: ".$_POST["email_expediteur"]." <".$_POST["email_expediteur"].">\n";
$entete .= "MIME-Version: 1.0";
if (@mail($email_webmaster,$_POST["nom"],$_POST["titre"],$_POST["message"],$entete)){
// mail envoyé

Dans ma petite tête j'étais certain que cela fonctionnerait, mais non !

À chaque fois ce que je récupère c'est le message d'erreur déclenché par le script :

Un problème s'est produit lors de l'envoi du message

Et je ne comprends pas du tout du tout. :(

Quelle erreur ai-je pu commettre ?

Merci d'avance pour vos réponses.

Modifié par H2V
Posté (modifié)

Si ça peut intéresser quelqu'un, j'ai traduit le formulaire en Néerlandais avec un code capcha du style 2+8= ...

Il faut télécharger antispam.php et contacten.php dans le même répertoire.

<?php
include_once("antispam.php");
?>

<?php
// Vertaling van Yoav Rheims voor www.eretz.be
// n de lijn die volgt, webmaster_AT_domaine.tld door het adres e-mail van webmaster vervangen, waarnaar de berichten verzonden zullen moeten worden
$email_webmaster = "e-mail van de webmaster";
// Rajout alphega: In deze lijn example.com door de naam van uw plaats vervangen. Nuttig als u verschillende formulieren hebt.
$titre_cache = "Sinds de site naam van jij site";
// === behandeling van de gegevens van het formulier============================================================
if (isset($_POST["envoyer"])){
// het formulier werd voorgelegd
$etat = "erreur";
// Waarde per gebrek. Zal de waarde "ok" nemen als er geen fout is
// --- inzet in vorm van de velden die in het formulier bij zijn indiening worden gegrepen ---
if (isset($_POST["email_expediteur"])) {
$_POST["email_expediteur"]=trim(stripslashes($_POST["email_expediteur"]));
}
if (isset($_POST["titre"])) {
$_POST["titre"]=trim(stripslashes($_POST["titre"]));
}
if (isset($_POST["message"])) {
$_POST["message"]=trim(stripslashes($_POST["message"]));
}
// --- test van de geldigheid van de gegrepen velden---
if (empty($_POST["email_expediteur"])) {
// hij mist de e-mail van de afzender
$erreur="Grijpt uw adres e-mail ...";
}
elseif (!eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\.[a-z]{2,4}$",$_POST["email_expediteur"])){
// het adres e-mail is niet geldig
$erreur="Uw adres e-mail is niet geldig ...";
}
elseif (empty($_POST["message"])) {
//het bericht is leeg
$erreur="Voert een bericht in ...";
}
elseif (antispam_check() == false) {
// de rekening is vals
$erreur="Incorrect resultaat, zal opnieuw willen proberen !";
}
else {
// --- alle velden worden juist gevuld: men zal mail kunnen verzenden ---
$etat="ok";
}
}
else {
// --- het formulier werd niet voorgelegd ---
$etat="attente";
}
// === behandelingseind van de gegevens van het formulier =======================================================
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xml:lang="nl" lang="nl" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Contacten vertaling door Yoav Rheims voor www.eretz.be</title>
</head>
<body>

<?php
if ($etat!="ok"){// het formulier werd niet, voorgelegd of met een fout voorgelegd
if ($etat=="erreur"){
//het formulier werd met een fout voorgelegd
echo "<p><strong>".$erreur."</strong></p>\n";
// het bericht van fout te kennen geven
}
?>
<form method="post" action="<?php echo $_SERVER["PHP_SELF"]; ?>">
<p><label for="email_expediteur">Uw emailadres (Verplicht) :</label><br />
<input type="text" size="40" name="email_expediteur" id="email_expediteur" value="<?php
if (!empty($_POST["email_expediteur"])) {
// het adres e-mail van de afzender werd gegrepen: aangeven
echo htmlspecialchars($_POST["email_expediteur"],ENT_QUOTES);
}
?>" />
</p>
<p><label for="titre">Titel van het onderwerp (Facultatief) :</label><br />
<input type="text" size="40" name="titre" id="titre" value="<?php
if (!empty($_POST["titre"])) {
// de titel van het bericht werd ingevoerd: aangeven
echo htmlspecialchars($_POST["titre"],ENT_QUOTES);
}
?>" />
</p>
<p><label for="message">Onderwerp (Verplicht) :</label><br />
<textarea name="message" id="message" cols="40" rows="5"><?php
if (isset($_POST["message"])) {
// het bericht werd ingevoerd: aangeven
echo htmlspecialchars($_POST["message"],ENT_QUOTES);
}
?></textarea>
</p>
<p>Rekenresultaat:</p>
<?php antispam_ins(); ?>
<p><input type="submit" name="envoyer" value="Zenden" />
</p>
</form>
<?php
}
else {
// het formulier werd zonder fout voorgelegd, men verzendt mail
$entete = "From: ".$_POST["email_expediteur"]." <".$_POST["email_expediteur"].">\n";
$entete .= "Return-Path: ". $email_webmaster . "\n";
$entete .= "MIME-Version: 1.0";
if (@mail($email_webmaster,$titre_cache." / ".$_POST["titre"],$_POST["message"],$entete)){
// mail gezant
echo "Uw bericht werd verzonden.<br />\n";
echo "<a href=\"".$_SERVER["PHP_SELF"]."\">Een ander bericht verzenden ...</a>\n";
}
else {
// fout bij de zending van mail
echo "Een probleem heeft zich bij de zending van het bericht voorgedaan.\n";
echo "<a href=\"".$_SERVER["PHP_SELF"]."\">Probeert opnieuw ...</a>\n";
}
}
?>

Voici l'adresse exemple : http://yoavftp.yo.funpic.org/contacten.php

Modifié par Yoav
Posté

Je suis en train d'installer le script contact.php de alphega avec cryptographp. Cependant, je souhaiterais développer un formulaire avec davantage de champs que "message".

Je bute sur la ligne d'envoi du mail :

if (@mail($email_webmaster,$_POST["titre"],$_POST["message"],$entete)){

J'ai réussi à ajouter un "message2" (avec un champ textarea associé et en doublant $_POST["message"] avec $_POST["message2"]) et ça passe niveau mail. Cependant, je n'arrive pas aller au-delà.

Dans mon formulaire je voudrais les champs : Nom, Prénom, Fonction, Téléphone (en text) et Adresse (en textarea). Comment faire pour envoyer par mail toutes ces variables ?

De plus, comment envoyer aussi des chaînes d'intitulés, pour recevoir mon mail avec, par exemple :

Nom : Dupont

Prénom : Jean

Téléphone : 05 00 00 00 00 00

et ainsi de suite...

Peut-on concaténer tout ça dans une seule variable "message" y compris les retours à la ligne ? Et comment ?

Je ne suis pas connaisseur en PHP, mais je chipote le code...

Merci pour éventuelle réponse.

Posté

Bonjour,

Vous avez de la chance car je ne m'y connais pas énormément mais j'ai juste trouvé comment faire ceci il y a 3 jours lorsque j'ai eu besoin de rajouter un champ, plus exactement, dans mon cas, l'envoi d'un pseudo.

Ca vous aidera certainement pour ce que vous souhaitez obtenir. Voici ce que j'ai fait:

1- Rajout du champ pseudo (les parties rajoutées sont en gras):

<p><label for="titre">Titre de message (facultatif):</label><br />

<input type="text" size="50" name="titre" id="titre" value="<?php

if (!empty($_POST["titre"])) {

// le titre du message a été saisi: le réafficher

echo htmlspecialchars($_POST["titre"],ENT_QUOTES);

}

?>" />

</p>

<p><label for="titre">Votre pseudo (facultatif):</label><br />

<input type="text" size="50" name="pseudo" id="pseudo" value="<?php

if (!empty($_POST["pseudo"])) {

// le titre du message a été saisi: le réafficher

echo htmlspecialchars($_POST["pseudo"],ENT_QUOTES);

}

?>" />

</p>

<p><label for="message">Message (obligatoire):</label><br />

<textarea name="message" id="message" cols="60" rows="5"><?php

if (isset($_POST["message"])) {

// le message a été saisi: le réafficher

echo htmlspecialchars($_POST["message"],ENT_QUOTES);

}

?></textarea>

</p>

2- Récupération du pseudo dans "$message" et aussi de l'ip, du referer et de l'agent utilisateur grace au message précédent de "bed" que j'ai modifié car ça ne fonctionnait pas (les modifs sont en gras également):

// le formulaire a été soumis sans erreur, on envoie le mail

$entete = "From: ".$_POST["email_expediteur"]." <".$_POST["email_expediteur"].">\n";

$entete .= "Return-Path: ". $email_webmaster . "\n";

$entete .= "MIME-Version: 1.0";

$message="Provenance: ". $_SERVER['HTTP_REFERER'] . "\n";

$message.="Adresse IP: ". $_SERVER['REMOTE_ADDR'] . "\n";

$message.="Navigateur: ". $_SERVER['HTTP_USER_AGENT'] . "\n";

$message.="Pseudo: ". $_POST["pseudo"] . "\n\n";

3- envoi du message:

if (@mail($email_webmaster,$titre_cache." / ".$_POST["titre"],$message.$_POST["message"],$entete)){

// mail envoyé

J'ai réussi ceci en observant un peu les messages de tout le monde encore une fois.

Merci à tous d'ailleurs, j'ai maintenant un formulaire super complet avec un captcha accessible, ip du posteur etc... ;)

Posté

Oui, merci alphega pour cette superbe amélioration. J'ai eu un sale ralentissement php chez mon fournisseur dans la journée, mais ce soir ça roule et ton script fait des merveilles :P

J'ai aussi fait des petites améliorations et je vais faire un peu de didactique pour les newbees qui passeraient par là (étant donné la position sur Google, doit y avoir du monde).

Donc... A partir du scrypt de base de alphega que l'on trouve en page 1 de cette série de posts, pour ajouter des champs de formulaire il suffit de répliquer le morceau de script suivant dans la page html autant de fois que de champs nécessaires et voulus. Le morceau en question :

<label for="nom">Item :</label></td>
<td ><input type="text" size="60" name="item" id="item" value="<?php
if (!empty($_POST["item"])) {
// le item de l'expéditeur a été saisi : le réafficher
echo htmlspecialchars($_POST["item"],ENT_QUOTES);
}
?>" />

Vous remplacez "item" par ce dont vous avez besoin pour votre formulaire (nom, prenom, telephone, e-mail, etc.). ça c'est pour des champs text. Maintenant pour un textarea multiligne :

<label for="message">Message* :</label></td>		
<td ><textarea name="message" id="message" cols="45" rows="5"><?php
if (isset($_POST["message"])) {
// le message a été saisi: le réafficher
echo htmlspecialchars($_POST["message"],ENT_QUOTES);
}
?></textarea>

Là j'ai laissé le nom de l'item "message", car généralement un champ textarea sert pour la partie "message" d'un formulaire. Mais vous pouvez y mettre ce que vous voulez bien entendu.

Ensuite, on passe aux contrôles de sécurité et validation. Dans la partie "haute" du script de alphega, celle qui se trouve au-dessus du code HTML (au dessus de "<!DOCTYPE html PUBLIC ..."), pour chaque champ de votre formulaire vous devez ajouter ceci :

if (isset($_POST["item"])) {
$_POST["item"]=trim(stripslashes($_POST["item"]));
}

Je ne connais pas grand chose à PHP, mais je suppose (c'est "trim", qui me rappelle VBasic qui m'y fait penser), je suppose que ça enlève les slashes, voire les antislashes du contenu du champ, afin d'éviter le passage de codes malicieux par là. Enfin, alphega l'a mis, faut le mettre :wacko: Là encore, remplacer "item" par l'identité du champ en question (nom, prenom, telephone, etc.). Donc faire ça pour chaque champ de formulaire.

Ensuite, pour chaque champ obligatoire ajouter ceci :

if (empty($_POST["item"])) {
// le item est vide
$erreur="Saisissez votre item...";
}

Là, fastoche à comprendre, c'est pour obliger à remplir un champ avant d'envoyer le formulaire. Donc à n'utliser que pour les champs qui doivent être obligatoirement remplis (par exemple, l'adresse e-mail de l'expéditeur, qu'on puisse lui répondre).

A noter que pour les deux morceaux de scripts ci-dessus, il vaut mieux les mettre dans le même ordre que l'ordre des champs de formulaire dans la page.

A présent, retour en bas de page HTML, vers le code formulaire. La petite amélioration que j'ai ajoutée concerne le titre du message. En effet, un message de formulaire n'étant pas un e-mail à proprement parler, l'utilisateur se fout de mettre un titre. Par contre, le webmaster qui va recevoir le message voudrait bien recevoir des titres standardisés, qui lui disent aussitôt de quel formulaire de son site vient le message (par exemple, "Formulaire d'inscription", "Formulaire de commande", etc.). C'est pour cela que la variable titre n'est plus nourrie par un champ de formulaire, mais par une variable cachée (hidden) à laquelle l'utilisateur ne touche pas et qui est propre au formulaire. La voici, à placer juste sous la balise "<form method="post"..." :

<input type="hidden" id="titre" name="titre" value="Formulaire de contact">

Voilà, à la place de "Formulaire de contact" vous mettez ce que vous voulez et ça s'affichera dans le titre du mail que vous recevrez.

On arrive à la fin, dans la partie, tout en bas, du script pour envoyer le formulaire, je donne un exemple complet correspondant à un formulaire de contact avec nom, prénom, fonction, téléphone et message. En fait, on ajoute (ou retranche ou change) autant d'items que l'on veut.

$entete = "From : ".$_POST["email_expediteur"]." <".$_POST["email_expediteur"].">\n";
$entete .= "MIME-Version: 1.0";
$message="Provenance : ". $_SERVER['HTTP_REFERER'] . "\n";
$message.="Adresse IP : ". $_SERVER['REMOTE_ADDR'] . "\n";
$message.="Navigateur : ". $_SERVER['HTTP_USER_AGENT'] . "\n";
$message.="Nom : ". $_POST["nom"] . "\n";
$message.="Prénom : ". $_POST["prenom"] . "\n";
$message.="Fonction : ". $_POST["fonction"] . "\n";
$message.="Téléphone : ". $_POST["telephone"] . "\n\n";
$message.="Message : ";
if (@mail($email_webmaster,$_POST["titre"],$message.$_POST["message"],$entete)){

Quelques explications pour ceux qui connaissent pas. Les "\n" sont des retours à la ligne qui s'effectueront dans le message mail que vous recevrez. "Nom : ", etc. sont des intitulés des informations transmises (par exemple, dans votre message vous verrez "Nom : Dupont"). A ce propos, j'ai ajouté en dernier "Message : ", ce qui donne un intitulé à la partie "message" du mail. Que c'est pas beau de fignoler comme ça :rolleyes:

Voilà, je reviendrais certainement lorsque je testerai les cases à cocher et les listes de sélection... A bientôt et merci à tous.

Posté

Désolé, dans les deux premiers codes ci-dessus il traîne des balises de table "</td><td >" à enlever (ou bien mettre <tr><td> au début et </td></tr> à la fin pour avoir deux belles cellules de tableau, à encadrer par <table></table> bien sûr !).

Posté

Me revoilà avec donc de nouveaux champs de formulaire. Tout d'abord des bouton radio (un seul choix possible). Pour faire ça je me suis inspiré du code donné par Norbert_404, ce qui donne :

Veuillez choisir :<br>
<input type="radio" name="choix" id="choix1" value="<?php echo htmlspecialchars("A");?>" checked /><label for="choix1">A</label>
<input type="radio" name="choix" id="choix2" value="<?php echo htmlspecialchars("B");?>" /><label for="choix2">B</label>
<input type="radio" name="choix" id="choix3" value="<?php echo htmlspecialchars("C");?>" /><label for="choix3">C</label>

Le visiteur a le choix dans cet exemple (à adapter bien sûr à vos besoins) entre 3 options : A, B ou C.

Vous remarquerez la fameuse balise <label> (qui renvoie à l'id du champ) que j'ai découverte grâce à alphega ( :wub: ) et qui renforce l'ergonomie d'un formulaire, car le visiteur, surtout dans le cas des boutons radio (ou les checkbox) n'a pas besoin de passer une épreuve de psychomotricité fine en visant le petit rond (ou la petite case), mais peut simplement cliquer sur le texte d'option qui voisine avec le bouton radio (pitié pour les mal voyants).

Concernant le formatage il n'y en a pas pour un bouton radio (comment passer un antislash par un bouton radio, hein ? A ce propos, le "stripslashes" c'est pour retirer les anti-slashes d'une chaîne de caractères). Pas non plus de test de remplissage (je suppose qu'on pourrait en faire un du style "au moins un choix doit être fait"), le plus simple étant de forcer un choix avec "checked" (j'ai, dans mon exemple, forcé l'option A), libre au visiteur de changer de choix.

Pour ce qui concerne l'envoi du formulaire, j'ai utilisé la ligne suivante :

$message.="Choix du visiteur : ". $_POST["choix"] . "\n";

tout simplement ! Et dans le message mail reçu j'obtiens bien A, B ou C en fonction du bouton coché par le visiteur.

Passons à une case à cocher. J'ai suivi le même principe, ce qui donne :

<input type="checkbox" name="acceptation" id="acceptation" value="<?php echo htmlspecialchars("Accepté");?>" /> <label for="acceptation">J'accepte</label>

Ici, le visiteur peut cocher une case d'acceptation (de ce que vous voulez). Toujours l'ergonomie <label>, voir ci-dessus. Pour l'envoi cela donne :

$message.="Acceptation par le visiteur : ". $_POST["acceptation"];

Ainsi, dans le mail reçu si pas coché y'a rien, sinon je vois "Accepté".

Enfin, à noter une petite modif de la ligne de commande "@mail", puisque dans mon formulaire il n'y a que des champs text, boutons radio et checkbox et plus de message, donc ceci :

if (@mail($email_webmaster,$_POST["titre"],$message.$_POST["message"],$entete)){

devient :

if (@mail($email_webmaster,$_POST["titre"],$message,$entete)){

Au passage, dans le cas de l'utilisation du textarea "message" je suis d'ailleur en train de me demander si on ne peut pas tout simplement ajouter "message" dans $message et se passer ainsi d'envoyer $_POST["message"]. ça doit être possible, hein alphega ?

*******************************

Voilà, il me reste deux questions, pour alphega justement (ou un autre tout aussi performant...).

1) J'ai deux champs text pour une adresse e-mail et sa confirmation, donc je voudrais pouvoir insérer un test qui vérifie que "email_expediteur" est bien == à "re_email_expediteur" avec message d'erreur assorti, si ce n'est pas le cas.

2) concernant la case à cocher d'acceptation, là encore comment tester qu'elle est bien cochée et obliger cette coche pour l'envoi du formulaire ?

A vous de jouer ;)

Posté

Je ne suis pas assez calé pour te répondre à propos de ces modifications mais je suis sur qu'avec tout ce que compte le hub en bidouilleurs de haut vol, tu devrais trouver des réponses.

En tout cas merci pour ton récapitulatif car je crois que j'avais oublié le passage des "stripslashes" pour le rajout d'un champ :P

Posté (modifié)

Déjà une réponse concernant le test d'égalité entre deux variables (deux champs du formulaire donc).

Soit les deux champs à tester "email_expediteur" et "re_email_expediteur" (on demande au visiteur de ré-écrire son e-mail à l'identique, pour vérification). Le code de test est le suivant :

elseif (empty($_POST["email_expediteur"])) {
// l'e-mail est vide
$erreur="Saisissez votre e-mail...";
}
elseif (!eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\.[a-z]{2,4}$",$_POST["email_expediteur"])){
// l'adresse e-mail n'est pas valide
$erreur="Votre adresse e-mail n'est pas valide...";
}
elseif (empty($_POST["re_email_expediteur"])) {
// l'e-mail répétée est vide
$erreur="Re-saisissez votre e-mail...";
}
elseif ($_POST["email_expediteur"] !== $_POST["re_email_expediteur"]) {
// les e-mails ne sont pas identiques
$erreur="Re-saisissez votre e-mail à l'identique...";
}

Soit 4 tests :

  • vérifier que le premier champ e-mail contient quelque chose (pas vide)
  • dans ce cas vérifier sa validité (format xxx_AT_xxx)
  • vérifier que le deuxième champ e-mail contient quelque chose (pas vide)
  • et c'est là qu'apparaît le test d'égalité avec l'opérateur "!==" qui veut dire "différent" et si les deux adresses mail saisies sont différentes alors on renvoie le message d'erreur

Modifié par dorjee
Posté

Bonjour

Je voulais vous remercier tous les 2 parce que

1/ j'ai appris beaucoup de choses

et

2/ grâce à vous j'ai réussi à mettre en place ce sacré formulaire qui me faisait tourner en bourique depuis quelques jours.

Reste plus qu'à le mettre en forme pour qu'il soit un peu plus sexy.

Merci encore.

H2V

  • 2 semaines plus tard...
Posté

:thumbsup: Bravo à tous - Je viens juste de m'inscrire sur Hub et en quelques heures j'ai pu mettre en place le formulaire. Je ne connais vraiment rien au développement et m'arrachais les cheveux pour savoir comment mettre en place un formulaire de contact.

Le votre est simple,

Le code est propre

et en plus vous avez vraiment bien réfléchi la sécurité.

Je suis étonné de ne pas trouver de démo de vos travaux alors j'ajoute un lien sur lequel je vais mettre le formulaire avec :

Chekbox

adresse ip

nom

e mail (dans l'entête + le message pour être à mon goût) :whistling:

J'ai choisi la méthode de calcul simple et efficace.

Notes :

- Malheureusement pour le calcul les résultats négatifs doivent obligatoirement être inscrits sous cette forme :

Ex : -6 et non - 6 Je conseille donc de prévenir les internautes.

- On pourrait compléter par l'envoi d'un mail de confirmation sympathique à l'expéditeur. (ce qui permet à l'internaute la vérification de validité de son mail...)

- Une extension (qu'on trouve peut-être ailleurs sur le site): une boite dialogue interne avec les clients pour les réponses (ex: Amen ou Xiti) avec alerte mail automatique à l'internaute - ça évite aux mails de se balader et de diminuer totalement les spams et messages abusifs.

Malheureusement, je ne connais rien au développement, je ne peux que lancer des idées...

Démo Formulaire

Posté

Merci pour les remerciements !

Je posterai bientôt l'url du site sur lequel je travaille et où on verra les formulaires en question...

a+

  • 2 semaines plus tard...
Posté (modifié)

Hello,

J'aime bien l'idée de l'addition que je viens d'implémenter :)

J'ai fait une variante de byc qui me semble plus simple. En fait, a la place de la fonction de décodage, je mets dans la value de l'input "asb" le resultat de l'opération passé à md5(). A la reception du formulaire je n'ai plus qu'a tester l'égalité

md5($asa) == $asb

Pour compliqué un peu on peut ajouter une valeur fixe au calcul.

Modifié par adn
Posté

Hello

ayant reçu sur le weekend 63 spams dans ma boîte à lettres provenant de mes formulaires je viens de mettre le captcha de calcul de byc que je tiens à remercier.

@ adn : n'étant pas compétent je n'ai pas compris mais je suivrais vos discussions à ce propos.

Bonne journée

Posté

Hello,

Voici le code (noter que, j'ai limité l'opération a une addition):

<?
$operateur = array("+", "-");
$alpha = rand(1, 10);
$op = rand(0, 0);
$beta = rand(1, 10);
$res = md5($alpha + $beta); // pour compliquer on peut ajouter une constante au calcul
?>
(Contre le spam) <? echo $alpha." ".$operateur[$op]." ".$beta." = "; ?>
<input name="asa" type="text" size="10" value="" />
<input type="hidden" name="asb" value="<? echo $res; ?>" />

A la reception du formulaire, tester:

md5($asa) != $asb

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant

×
×
  • Créer...