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

Aller au contenu

  • 6 Pages +
  • 1
  • 2
  • 3
  • Dernière »
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

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

#1 L'utilisateur est hors-ligne   alphega 

  • Groupe : Hubmaster
  • Messages : 277
  • Inscrit(e) : 07-novembre 04
  • Genre:Homme
  • Localisation:Eysines

Posté 23 octobre 2006 - 11:57

Bonjour,

J'utilise pour mes sites le formulaire de contact proposé sur les publications du hub: Un "Mailer" pour votre site web
Il fonctionne correctement mais sur un de mes sites un peu populaire je vois que des robots tentent de spammer, je reçois des mails avec des caractères style:

Citation

Content-Type: multipart/alternative;
boundary=a07b15e738d180de6cb54849bee2c396
X-Mailer: Pegasus Mail for Windows (v4.02)


J'aimerais donc installer une vérification avec saisie d'un code image "captcha" mais je ne connais pas le php.
En attendant que je finisse mon bouquin "php mysql pour les nuls" :smartass: , quelqu'un connaitrait-t-il un formulaire similaire mais avec captcha pour un copieur/colleur tel que moi ?

Merci.

Edit: titre

Ce message a été modifié par alphega - 23 octobre 2006 - 23:24.

Passionnés d'informatique, discutez ordinateur, windows, logiciels et technologies sur le forum informatique CNET
0

#2 L'utilisateur est hors-ligne   Régis 

  • Groupe : Membre+
  • Messages : 2 416
  • Inscrit(e) : 07-mai 04
  • Genre:Homme

Posté 23 octobre 2006 - 12:29

Voir le messagealphega, le lundi 23 octobre 2006, 12h57, dit :

(...)quelqu'un connaitrait-t-il un formulaire similaire mais avec captcha pour un copieur/colleur tel que moi ?
Bonjour 'alphega',
As-tu regardé sur ce post du HUB : Cherche script "captcha", peut-être y trouveras-tu ton bonheur ....
0

#3 L'utilisateur est hors-ligne   guilhem_mdg 

  • Groupe : Membre
  • Messages : 43
  • Inscrit(e) : 08-septembre 06

Posté 23 octobre 2006 - 12:47

Bonjour,
Je te conseille d'aller voir le site suivant :
http://www.cryptographp.com/
A + !
0

#4 L'utilisateur est hors-ligne   alphega 

  • Groupe : Hubmaster
  • Messages : 277
  • Inscrit(e) : 07-novembre 04
  • Genre:Homme
  • Localisation:Eysines

Posté 23 octobre 2006 - 23:23

Un grand merci à tous les deux, j'ai donc opté pour cryptographp qui était conseillé aussi dans l'autre sujet.

La doc est assez claire, meme si je manquais de connaissances pour integrer l'étape de vérification de l'image dans le formulaire.
Mais je suis bien décidé à me mettre au php qui me fait cruellement défaut, et j'ai donc planché plus de 3 heures pour tenter de comprendre... et j'ai finalement réussi :P

Je suis tellement content que je laisse la procédure simplifiée et le code obtenu après intégration pour ceux qui ont autant de mal que moi avec le php:

1 - Télécharger cryptographp (version 1.3)
2 - Dézipper, puis envoyer le dossier crypt et son contenu sur votre serveur
3 - Créer le fichier contact.php avec le code ci-dessous (ne pas oublier d'éditer la ligne: $email_webmaster = "webmaster_AT_domaine.tld"; pour y mettre votre email)

<?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_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 (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 XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xml:lang="fr" lang="fr" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formulaire de contact</title>
</head>
<body>
<h1>Contacter le webmaster</h1>
<?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";
        }
}
?>
</body>
</html>



Uploadez le fichier contact.php ... et c'est tout! Tester le formulaire
Passionnés d'informatique, discutez ordinateur, windows, logiciels et technologies sur le forum informatique CNET
0

#5 L'utilisateur est hors-ligne   Norbert_404 

  • Groupe : Membre
  • Messages : 18
  • Inscrit(e) : 12-novembre 06

Posté 12 novembre 2006 - 17:50

Bonjour,
J'ai une petite question sur le couple Mailer+cryptograph.
J'ai pris le temps de bien chercher les réponses à mes questions, mais sans succés...

1. Le code du mailer empeche t-il les attaques par injection d'en-tête ?
Si non, quel code faudrait-il ajouter ? et ou ?

2. Concernant ceci :
$email_webmaster = "webmaster_AT_domaine.tld";

Si je met mon adresse email - azerty_AT_abc.fr par exemple - qu'est-ce qui peut empêcher qqn de regarder la source du script afin de prélever l'adresse ?

Voila merci et a+ sur WH :)
0

#6 L'utilisateur est hors-ligne   alphega 

  • Groupe : Hubmaster
  • Messages : 277
  • Inscrit(e) : 07-novembre 04
  • Genre:Homme
  • Localisation:Eysines

Posté 12 novembre 2006 - 17:56

Bonjour,

Citation

Si je met mon adresse email - azerty_AT_abc.fr par exemple - qu'est-ce qui peut empêcher qqn de regarder la source du script afin de prélever l'adresse ?
L'email n'apparait pas dans la source du html mais dans celle du php. Il est donc invisible pour les visiteurs de la page, robots compris.

Par contre, pour la 1ere question Le code du mailer empeche t-il les attaques par injection d'en-tête ?, je ne saurais te dire...
Passionnés d'informatique, discutez ordinateur, windows, logiciels et technologies sur le forum informatique CNET
0

#7 L'utilisateur est hors-ligne   Norbert_404 

  • Groupe : Membre
  • Messages : 18
  • Inscrit(e) : 12-novembre 06

Posté 12 novembre 2006 - 18:29

Bonsoir,
Merci pour la réponse ;-)

Citation

L'email n'apparait pas dans la source du html mais dans celle du php.


ah oui, je crois avoir compris:
donc il y a sur la même page (ex contact.php) une partie du code php contenant l'adresse email,
<?php include "crypt/functions.php"; ?>
etc...
etc...
// === fin de traitement des données du formulaire =======================================================
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

et dans le code html il y a le formulaire avec le reste du code.

Ce qui fait que quand la page est affichée dans un navigateur, la 1ere partie du code "disparaît" aprés avoir été traitée par le serveur.
Est-ce bien cela ?

---

Je crois avoir trouvé un code anti injection d'en-tête, mais je ne sais vraiment pas ou le mettre dans le code du mailer


<?php
   $from = $_POST["sender"];
   $from = urldecode($from);
   if (eregi("\r",$from) || eregi("\n",$from)){
	 die("Why ?? :(");
   }
 ?>



a+

Ce message a été modifié par Norbert_404 - 12 novembre 2006 - 18:31.

0

#8 L'utilisateur est hors-ligne   alphega 

  • Groupe : Hubmaster
  • Messages : 277
  • Inscrit(e) : 07-novembre 04
  • Genre:Homme
  • Localisation:Eysines

Posté 12 novembre 2006 - 18:38

Citation

Ce qui fait que quand la page est affichée dans un navigateur, la 1ere partie du code "disparaît" aprés avoir été traitée par le serveur.
Est-ce bien cela ?

Presque... car en fait il y a du php aussi dans la deuxième partie de la page. Ce qui revient au meme car au final, seule le code html est affiché dans la source, pas le php.

html = langage client, interprété par le navigateur, par le pc du visiteur et accesible via la source.
php = langage serveur, interprété par le serveur/hebergeur, non accessible au visiteur.

Pour ce qui est du code anti-injection, je prefere laisser la parole a quelqu'un de plus informé que moi :blush:
Passionnés d'informatique, discutez ordinateur, windows, logiciels et technologies sur le forum informatique CNET
0

#9 L'utilisateur est hors-ligne   Norbert_404 

  • Groupe : Membre
  • Messages : 18
  • Inscrit(e) : 12-novembre 06

Posté 12 novembre 2006 - 18:47

Merci alphega !
ta précision confirme ce que je pensais ;- )
0

#10 L'utilisateur est hors-ligne   playedd 

  • Groupe : Membre
  • Messages : 12
  • Inscrit(e) : 13-novembre 06
  • Genre:Homme
  • Localisation:Mulhouse

Posté 13 novembre 2006 - 17:14

Bonjour,

Merci pour ce script. Le code fournit plus fonctionne bien, mais n'etant moi meme pas specialiste de la programmation et n'ayant pas plusieurs heures à consacrer pour dechiffrer les codes existants et trouver ma propre solution, je fais appel a vos connaissances car il subsiste malgré tout un probleme.

Pour certaines adresses, mon filtre anti-spam de mon operateur envoie certains mails emis depuis la page contact en courrier indésirables. J'ai la possibilité de rendre légitime des mails a partir du moment ou je peux proposer une partie fixe (ex "Contact site oueb trucmuche.com")

Ou et comment dois je installer cette fonctionnalité? Idéalement, je souhaiterai recevoir un mail dont l'objet est :
"Contact site oueb trucmuche / objet de l'internaute qui rempli le mail"

Merci pour vos réponses
0

#11 L'utilisateur est hors-ligne   alphega 

  • Groupe : Hubmaster
  • Messages : 277
  • Inscrit(e) : 07-novembre 04
  • Genre:Homme
  • Localisation:Eysines

Posté 14 novembre 2006 - 01:02

Citation

Pour certaines adresses, mon filtre anti-spam de mon operateur envoie certains mails emis depuis la page contact en courrier indésirables.

J'ai remarqué aussi que gmail me classait l'email en spam. Pour contourner ce problème j'ai rajouté la ligne en gras dans le code:

// 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";
if (@mail($email_webmaster,$_POST["titre"],$_POST["message"],$entete)){


Après ça, plus de classement dans le spam.

Citation

Idéalement, je souhaiterai recevoir un mail dont l'objet est :
"Contact site oueb trucmuche / objet de l'internaute qui rempli le mail"

Rajoute la ligne en gras et remplis là comme tu veux:

// 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";
$titre_cache = "Depuis le site...... / ";
// === traitement des données du formulaire


Et aussi cette partie en gras/orange à rajouter :

$entete .= "MIME-Version: 1.0";
if (@mail($email_webmaster,$titre_cache.$_POST["titre"],$_POST[" message"],$entete)){
// mail envoyé



Comme je l'ai dit plus haut dans le sujet, je commence juste à comprendre un peu le php et je ne sais pas si "c'est correct" mais en tout cas, ça fonctionne chez moi :)

Ce message a été modifié par alphega - 14 novembre 2006 - 01:03.

Passionnés d'informatique, discutez ordinateur, windows, logiciels et technologies sur le forum informatique CNET
0

#12 L'utilisateur est hors-ligne   Neoxy 

  • Groupe : Hubmaster
  • Messages : 151
  • Inscrit(e) : 15-octobre 06
  • Genre:Homme
  • Localisation:Grenoble
  • Société:Neoxy

Posté 14 novembre 2006 - 07:23

Salut

Une des methode pour eviter de se faire spamer son formulaire est de controler si les champs contiennent des \n ou des \r lors de la saisie, ce sont des retour charios qu'on retrouve dans le header, en PHP, on peut controler ce genre de caractéres avec la fonction :

ereg("$_POST["email"]", "\n")
par exemple

Le header injection est de plus en plus fréquent sur les formulaire de contact web.

D'autre part, je trouve que la technique captcha qui génére un code dans une image n'est pas très cool en terme d'accessibilité pour les personnes non voyante par exemple.

Les contrôles du type question comme : "combien font 3 + 4 ?" sont plus interessant dans l'utilisation.

Il exisite des module sur le net pour l'implémenter sur des formulaire de contact, mais ce procédé est déja utilisé par les blog du type dotclear et ca à l'air de bien marcher.
Sun Location : comparateur d’hebergement vacances pour trouver une location saisonniere, reserver un hotel ou louer un mobil home en France et dans de nombreux pays.
0

#13 L'utilisateur est hors-ligne   playedd 

  • Groupe : Membre
  • Messages : 12
  • Inscrit(e) : 13-novembre 06
  • Genre:Homme
  • Localisation:Mulhouse

Posté 14 novembre 2006 - 07:51

Voir le messageNeoxy, le mardi 14 novembre 2006, 07h23, dit :

D'autre part, je trouve que la technique captcha qui génére un code dans une image n'est pas très cool en terme d'accessibilité pour les personnes non voyante par exemple.

Les contrôles du type question comme : "combien font 3 + 4 ?" sont plus interessant dans l'utilisation.

Il exisite des module sur le net pour l'implémenter sur des formulaire de contact, mais ce procédé est déja utilisé par les blog du type dotclear et ca à l'air de bien marcher.


Salut, merci pour vos reponses, je vais essayer d'implementer tout cela dans la journée.
Pour le captcha, je suis tout a fait d'accord avec toi pour la question d'accessibilité. C'est pas l'ideal. Je ne connaissais pas l'utilisation d'une question automatique. Y'a-t-il un lien pour une demo, ou mieux, un lien vers un script?
Merci
0

#14 L'utilisateur est hors-ligne   Norbert_404 

  • Groupe : Membre
  • Messages : 18
  • Inscrit(e) : 12-novembre 06

Posté 14 novembre 2006 - 10:28

Bonjour à tous ! :)

J'ai fait pas mal de recherche sur le net à propos de injection de header

eregi("$_POST["email"]", "\n")

J'ai l'impression que le code ci-dessus passe en revue l'ensemble de l'email afin de trouvé une éventuel retour.
Si oui, donc on serait obliger de rédiger un email sur une seule ligne, non ?

Par contre le code suivant ne s'occupe que du champ "From" :
if (eregi("\r",$from) || eregi("\n",$from)){
die("Why ?? :(");
}


Le code est-il bien inséré au bon endroit ?
// Si le formulaire a été envoyé
$from=$_POST["expediteur"];
if (eregi("\r",$from) || eregi("\n",$from)){
die("Why ?? :(");
}
$to=$_POST["destinataire"];
// On envoie le mail :


Merci ;)
0

#15 L'utilisateur est hors-ligne   Norbert_404 

  • Groupe : Membre
  • Messages : 18
  • Inscrit(e) : 12-novembre 06

Posté 15 novembre 2006 - 00:41

Bon me revoila !

J'ai fait des test d'injection d'en-tête sur formulaire php tout simple en suivant un article : l'injection marche ! (c'est normal)
Aprés avoir installé le mailer proposé dans le forum et j'ai suivi de nouveau l'article : ce mailer semble être protégé contre cela...

Par contre j'ai utilisé le code mailer + crypto * donnée par alphega au post 4 : rien à faire, ça ne marche pas...
J'ai suivit les consignes données par le site cryptograph : pareil, ça ne marche pas...
Comment et ou inclure les codes du crypto avec le mailer ???

A+++
*Tant pis pour l'accéssibilité de mon site, je ferai comme ça dans un 1er temps...
0

#16 L'utilisateur est hors-ligne   alphega 

  • Groupe : Hubmaster
  • Messages : 277
  • Inscrit(e) : 07-novembre 04
  • Genre:Homme
  • Localisation:Eysines

Posté 15 novembre 2006 - 09:52

Citation

Par contre j'ai utilisé le code mailer + crypto donnée par alphega au post 4 : rien à faire, ça ne marche pas...

Ah bon, le formulaire ? C'est peut-etre parce que tu ne places pas le dossier "crypt" au meme endroit que ta page de contact.
Si ta page de contact est à la racine de ton site, il faut modifier la 1ere ligne qui est normalement celle ci:
<?php include "crypt/functions.php"; ?>


Si la page contact est dans un repertoire (www.example.com/repertoire/contact.php), ça donnera
<?php include "../crypt/functions.php"; ?>


Si la page contact est dans un sous-repertoire (www.example.com/repertoire/sous-repertoire/contact.php), ça donnera
<?php include "../../crypt/functions.php"; ?>


Sinon qu'est ce qui ne fonctionne pas ? L'envoi, l'affichage ... ?
Passionnés d'informatique, discutez ordinateur, windows, logiciels et technologies sur le forum informatique CNET
0

#17 L'utilisateur est hors-ligne   playedd 

  • Groupe : Membre
  • Messages : 12
  • Inscrit(e) : 13-novembre 06
  • Genre:Homme
  • Localisation:Mulhouse

Posté 15 novembre 2006 - 10:26

Question toute bete pour un novice, c'est quoi une injection d'en-tête?
Merci
0

#18 L'utilisateur est hors-ligne   byc 

  • Groupe : Membre
  • Messages : 10
  • Inscrit(e) : 08-novembre 06
  • Genre:Homme
  • Localisation:Ile de France

Posté 15 novembre 2006 - 10:30

Voir le messageplayedd, le mardi 14 novembre 2006, 07h51, dit :

Salut, merci pour vos reponses, je vais essayer d'implementer tout cela dans la journée.
Pour le captcha, je suis tout a fait d'accord avec toi pour la question d'accessibilité. C'est pas l'ideal. Je ne connaissais pas l'utilisation d'une question automatique. Y'a-t-il un lien pour une demo, ou mieux, un lien vers un script?
Merci



J'ai mis en place un système "antispam" générant une simple addition ou soustraction à implémenter dans n'importe quel formulaire. J'ai été content de constater que mon script perso fonctionnait à merveille.

Voici la page où vous pourrez voir la démo : ici

:)

Ce message a été modifié par byc - 15 novembre 2006 - 10:31.

0

#19 L'utilisateur est hors-ligne   freemaster 

  • Groupe : Membre
  • Messages : 35
  • Inscrit(e) : 06-décembre 05
  • Localisation:France
  • Société:Asrun

Posté 15 novembre 2006 - 11:24

ah ouais d'accord !
pour 3 + 4 tu le compares à 3_0_4
moi mon erreur c'est d'avoir mis la véritable valeur à comparer dans la source, et les robots arrivent à poster quand même lol

et j'imagines que tu fait un explode pour ajouter les extrémités ;)

je m'en vais améliorer ce que j'ai fait :thumbsup:
0

#20 L'utilisateur est hors-ligne   alphega 

  • Groupe : Hubmaster
  • Messages : 277
  • Inscrit(e) : 07-novembre 04
  • Genre:Homme
  • Localisation:Eysines

Posté 15 novembre 2006 - 15:18

C'est excellent ce système d'addition :thumbsup:
N'hésitez pas à le partager et à expliquer comment l'intégrer si le coeur vous en dit ;)
Passionnés d'informatique, discutez ordinateur, windows, logiciels et technologies sur le forum informatique CNET
0

Partager ce sujet :


  • 6 Pages +
  • 1
  • 2
  • 3
  • Dernière »
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)