From b155d38da8c0b446d20fd14697bc292e994a33bb Mon Sep 17 00:00:00 2001 From: Zatalyz Date: Wed, 11 Sep 2024 15:06:40 +0200 Subject: [PATCH] =?UTF-8?q?Initial=20release.=20Fonctionnel=20quand=20m?= =?UTF-8?q?=C3=AAme.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 57 +++++++++++++++++++++- form.php | 125 ++++++++++++++++++++++++++++++++++++++++++++++++ form_config.php | 64 +++++++++++++++++++++++++ form_lang.php | 84 ++++++++++++++++++++++++++++++++ form_struct.php | 41 ++++++++++++++++ 5 files changed, 369 insertions(+), 2 deletions(-) create mode 100644 form.php create mode 100644 form_config.php create mode 100644 form_lang.php create mode 100644 form_struct.php diff --git a/README.md b/README.md index b890e4c..b8c0e91 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,56 @@ -# contactphpantibot +# Formulaire de contact en php avec mesures antispam (contactphpantibot) -Ceci est un "hook" php afin d'ajouter un formulaire de contact en php sur des sites basiques. Il intègre quelques protections pour limiter le spam, sans passer par des captchas ou des ressources coûteuses en temps de calcul. Ça reste assez basique. \ No newline at end of file +Ceci est un "hook" php afin d'ajouter un formulaire de contact en php sur des sites basiques. Il intègre quelques protections pour limiter le spam, sans passer par des captchas ou des ressources coûteuses en temps de calcul. Ça reste assez basique. + +Ouais, du php. Na. + +J'ai découpé en plusieurs fichiers, sans doute que ça peut se condenser. Je ne suis pas dev, il est donc possible que ce soit très foireux. Toute aide pour améliorer est bienvenue. + +## Installation +Copiez les fichiers php là où vous voulez sur votre site. Vérifiez les chemins (je pourrais améliorer ça dans la config ; on verra à l'usage). Incluez "form.php" où vous voulez sur une de vos pages php : + + + +Le script utilise la fonction mail de php, donc faut avoir php ET de quoi envoyer des mails sur votre serveur. Moi, j'utilise msmtp (https://alinea.ninm.net/dokuwiki/pratique:informatique:mail_relai ), c'est bien, simple et facile. + +## Configuration +Modifiez le fichier "form_config.php" pour adapter à vos propres paramètres. En particulier le mail... + +## Personnalisation et multilingue +Modifiez "form_lang.php" pour personnaliser les messages, voir ajouter des langues. + +"form_struct.php" concerne le formulaire "presque" html. Ajoutez les classes de votre site web. + +Non, je n'inclue pas de css, faut que ce soit cohérent avec les sites, donc : débrouillez-vous. + +C'est aussi là qu'il y a la liste des questions parce que si c'est multilingue, c'est mieux de traduire vos questions, justement. + +## Mesures antispams +### Honeypot +Il y a une case qui peut être cochée mais invisible (en principe) pour les êtres humains. Je ne sais pas trop si les lecteurs d'écran risquent de la voir donc j'ai ajouté une description. + +Les bots les plus basiques vont soit tout cocher, soit rien. Or il faut laisser décoché la case "je suis un bot" et cocher "je suis un être humain" pour que l'envoi fonctionne. + +### Pas de liens +S'il y a un lien, ça va bloquer l'envoi. Parce que c'est rare qu'un premier contact légitime vous envoie un lien... + +### Mots-clés bloqués +Il y a une liste (basique) de mots-clés qui vont empecher l'envoi d'un mail. Ça demande à être complété. C'est très basique aussi bien sûr. + +### Question personnalisée +Ça reste assez redoutable pour pas mal de bots. Créez les votres, c'est comme ça que c'est le plus efficace. + +#### Efficacité +Soyons honnête : ça va filtrer les plus basiques. Mais c'est déjà ça. On ne fera pas face aux IA avec ça, mais qui va brûler des tonnes d'énergie pour vous envoyer un message proposant des élargissements de péniches ? Oui, on sait, ils le feront… Mais en attendant d'avoir de meilleurs parades, ça limitera un petit peu le spam dans votre boîte. + + +## Todo +Il faudrait ajouter +- Une gestion des délais en associant le token csrf du formulaire avec un timestamp et refuser la requete si elle est faite trop rapidement +- Une détection des ip faisant des erreurs afin de les bannir + +Il faut aussi vérifier l'accessibilité. Ça semble acceptable "là", à voir quand on est inclus dans un site. + +Et puis ajouter un menu déroulant avec options à choisir pour celles qui veulent trier un peu ("devis", "papote", "formation", etc). À inclure en première ligne du message. diff --git a/form.php b/form.php new file mode 100644 index 0000000..05c6c8f --- /dev/null +++ b/form.php @@ -0,0 +1,125 @@ +"; + if (mail($to, $subjectreal, $message, $headers)) { + echo $txt['email_success']; + } else { + echo $txt['email_error']; + } + } else { + echo $txt['bad_answer']; + include 'form_struct.php'; // Réaffiche le formulaire en cas d'erreur + } + } + } + } + } +} else { + // Ici on affiche le formulaire, c'est l'affichage par défaut + include 'form_struct.php'; +} +?> +
Retour au site
diff --git a/form_config.php b/form_config.php new file mode 100644 index 0000000..3156927 --- /dev/null +++ b/form_config.php @@ -0,0 +1,64 @@ + 'mail@example.org', // Mettez votre adresse + 'subject_prefix' => 'Message via site', // Personnalisez le début des sujets envoyés via le formulaire + 'languages' => ['fr', 'en'], // Liste des langues disponibles + 'bad_words' => [ + // Liste de mots-clés qui vont bloquer l'envoi de formulaire (filtre un peu) + 'casino', + 'gambling', + 'ranks', + 'Bitcoin', + 'viagra', + 'v i a g r a', + 'gagner de l\'argent', + 'offre spéciale', + 'cliquez ici', + 'pharmacie', + 'vente en gros', + 'meilleur prix', + 'produit miracle', + 'augmentez vos revenus', + 'assurance', + 'crédit facile', + 'urgent', + 'gagnez de l\'argent rapidement', + 'offre limitée', + 'compléments alimentaires', + 'dépêchez-vous', + 'réduction exclusive', + 'investissement sans risque', + 'données confidentielles', + 'vérifiez votre compte', + 'richesse rapide', + 'prêt personnel', + 'récompenses', + 'gagnez maintenant', + 'promotion', + 'faites des économies', + 'enquête rémunérée', + 'investir maintenant', + 'déclaration de revenus', + 'fonds d\'investissement', + 'revenu passif', + 'annonce', + 'super offre', + 'affaire en or', + 'confirmation de compte', + 'sécurisé', + 'certificat gratuit', + 'remboursement', + 'ne manquez pas', + 'cadeau gratuit', + 'réponse immédiate', + 'email marketing', + 'satisfaction garantie', + 'augmenter vos ventes', + 'réclamez votre prix', + 'assistance gratuite', + 'téléchargez maintenant', + 'sans frais', + ] +]; +?> diff --git a/form_lang.php b/form_lang.php new file mode 100644 index 0000000..c77fec8 --- /dev/null +++ b/form_lang.php @@ -0,0 +1,84 @@ + array( + // Champs du formulaire + 'name' => "Nom", + 'mail' => "Courriel", + 'subject' => "Sujet", + 'message' => "Message", + // messages d'erreurs + 'required_fields' => "Tous les champs sont obligatoires.", + 'link_error' => "Les liens sont interdits dans le message.", + 'bad_word_error' => "Votre message contient des termes utilisé par les spammeurs, il n'a pas été envoyé.", + 'email_success' => "Votre message a été envoyé avec succès.", + 'email_error' => "Une erreur s'est produite lors de l'envoi du message. Veuillez réessayer. Si cela se répète, c'est simplement que le formulaire est cassé, ne vous acharnez pas.", + 'antispam_error' => "Vous avez agi comme un bot ; si vous n'en êtes pas un, cochez la bonne case.", + 'submit_button' => "Envoyer", + 'new_question_button' => "Demander une autre question", + 'human' => "Je confirme que je suis un être humain, et que ma demande de contact est directement en rapport avec le site et n'est pas destiné à vendre quelque chose ou une quelconque pratique de type spam.", + 'bot' => "Je suis un bot et je ne veux pas envoyer de courrier, je coche la case.", + 'good_answer' => "Félicitations ! Votre réponse est correcte.", + 'bad_answer' => "Réponse incorrecte. Essayez encore, mais pas trop vite ni trop de fois...", + 'questions' => [ + // personnalisez ces questions afin de complexifier la vie des spammeurs ! + // Vous pouvez en ajouter autant que vous voulez. + "Quelle est la couleur du ciel ?" => ["bleu", "gris", "orange"], + "Donnez la couleur d'une cerise." => ["rouge", "vert", "blanc"], + "Combien de pattes a un chien en bonne santé ?" => ["quatre", "4", "quatres"], + "Donnez le nom d'une saison en climat tempéré" => ["hiver", "automne", "été", "printemps"], + "Vous êtes plutôt thé, chocolat, ou autre ?" => ["thé", "chocolat", "autre"], + "Quelle couleur obtient-on en mélangeant du bleu et du jaune ?" => ["vert"], + "Quel animal de la savane a des rayures noires et blanches ?" => ["zèbre", "le zèbre", "les zèbres"], + "Quel est le jour de la semaine actuel ?" => ["lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"], + ], + + ), + 'en' => array( + // Form fields + 'name' => "Name", + 'mail' => "Email", + 'subject' => "Subject", + 'message' => "Message", + // error messages + 'required_fields' => "All fields are required", + 'link_error' => "Links are forbidden in the message", + 'bad_word_error' => "Your message contains terms used by spammers, it has not been sent", + 'email_success' => "Your message has been sent successfully", + 'email_error' => "An error has occurred while trying to send this message. Please try again. If this happens again, it's simply that the form is broken, so don't bother.", + 'antispam_error' => "You've acted like a bot; if you're not, tick the right box.", + 'submit_button' => "Send", + 'new_question_button' => "Ask another question", + 'human' => "I confirm that I am a human being, and that my contact request is directly related to the site and is not intended to sell anything or any spam-like practice.", + 'bot' => "I'm a bot and I don't want to send any mail, I tick the box.", + 'good_answer' => "Congratulations! Your answer is correct.", + 'bad_answer' => "Incorrect answer. Try again, but not too fast or too many times...", + 'questions' => [ + // Customise these questions to make life more difficult for spammers! + // You can add as many as you like. + 'What colour is the sky?' => ["blue", "grey", "orange"], + 'What colour is a cherry?' => ["red", "green", "white"], + 'How many legs does a healthy dog have?' => ["four", "4"], + 'Name a season in a temperate climate' => ["winter", "autumn", "summer", "spring"], + 'Do you prefer tea, chocolate or something else?' => ["tea", "chocolate", "something else"], + 'What colour do you get if you mix blue and yellow?' => ["green"], + 'Which savannah animal has black and white stripes?' => ["zebra", "the zebra", "zebras"], + 'What is the current day of the week?' => ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], + ], + ) +); + +// Quelques déclarations pour que ça marche +// Définir la langue par défaut +$language = isset($_GET['lang']) ? $_GET['lang'] : 'fr'; + +// Si la langue n'existe pas dans le tableau, on utilise 'fr' par défaut +if (!array_key_exists($language, $lang)) { + $language = 'fr'; +} + +// Crée une variable pour stocker les textes dans la langue sélectionnée +$txt = $lang[$language]; + +?> + diff --git a/form_struct.php b/form_struct.php new file mode 100644 index 0000000..d006c53 --- /dev/null +++ b/form_struct.php @@ -0,0 +1,41 @@ +

Contact

+

Vous voulez me spammer ? Heu, me contacter ? Laissez-moi un gentil mot :)

+ +
+ + + + + + + + +

+ +

+ +

+
+

+

Mesure anti spambot

+

Parce que je n'aime pas le spam, je n'aime pas les messages douteux, et j'aime pas trop qu'on me cause en fait. Attention à vos réponses, je vous bannis de mes serveurs si vous êtes méchants.

+ +

+ +

+ + + + +

+
+ +

+ + + +

+ + + +