Robots spammeurs - SOS

Gload
Invité n'ayant pas de compte PHPfrance

18 nov. 2018, 15:14

Bonjour,

Je viens vers vous car je suis désespéré :(
Je suis prestataire de service de ce fait, mon serveur est exposé publiquement à divers clients.

Ma fonction première n'est pas de faire du développement d'où ma demande...

Bref, voici mon souci :

j'ai un formulaire de demande de contact avec mes clients, et... je vous laisse regarder la capture d'écran... :priere:
Image

J'ai essayé de mettre en place un captcha classique, un recaptcha Google, et même le fameux "honeypot" pour induire le robot en erreur mais rien y fait.
Concernant le Recaptcha Google, je ne suis pas sûr d'arriver correctement à l'installer car il me semble qu'il est très efficace.

Pouvez-vous m'aider, s'il vous plaît ? Je désespère (et ne vous fiez pas à l'IP, elle change constamment... j'ai 150 demandes comme ça par jour...)

Merci à vous.

(PS : voici mon code de formulaire avec la requête PHP avec ma "protection" actuelle (qui fonctionne pas).
L'input "vente" est l'input cachée, selon la méthode Honeypot) :

Code : Tout sélectionner

<?php date_default_timezone_set('Europe/Paris'); $date = ''.date('d/m/Y').' à '.date('H:i:s').''; if(isset($_POST['vente']) && $_POST['vente'] != '') die(); if($_GET[action]=="enregistrer") { $a = addslashes($_POST["artiste_poster"]); $b = addslashes($_POST["email_poster"]); $c = addslashes($_POST["objet_poster"]); $d = addslashes($_POST["titre_poster"]); $e = $_SERVER['REMOTE_ADDR']; $f = ''.date('d/m/Y').' à '.date('H:i:s').''; if(!empty($a) AND !empty($b)) { $req = $bdd->prepare('INSERT INTO `contact` (pseudo, email, objet, message, ip, date) VALUES ("'.$a.'", "'.$b.'", "'.$c.'", "'.$d.'", "'.$e.'", "'.$f.'")'); echo('<meta http-equiv="refresh" content="0;URL=contact_ok.php"> '); $req->closeCursor(); $req->execute(); header("Location: ?m=1"); } else { header("Location: ?m=2"); } } if($_GET[m]=="1") { echo('<center><div class="alert alert-success" style="width:750px;"><center>La news a été ajoutée !</center></div></center>'); } if($_GET[m]=="2") { echo('<center><div class="alert alert-error" style="width:750px;"><center><b>ATTENTION !</b> Veuillez remplir tous les champs !</center></div></center>'); } ?> <form class="light_bg comment-form" action="?action=enregistrer" method="POST"> <div class="kode-left-comment-sec"> <input placeholder="vente*" style="text-transform: none" name="vente" type="hidden" value="" data-default="Vente*" size="30"> <div class="kf_commet_field"> <input placeholder="Nom et prénom*" style="text-transform: none" name="artiste_poster" type="text" value="" data-default="Name*" size="30" required> </div> <div class="kf_commet_field"> <input placeholder="Adresse e-mail valable*" style="text-transform: none" name="email_poster" type="text" value="" data-default="Email*" size="30" required> </div> <div class="kf_commet_field" style="width: 100%" > <input placeholder="Objet (recrutement, problème, bug ?)*" style="text-transform: none" name="objet_poster" type="text" value="" data-default="Website" size="30" required> </div> </div> <div class="kode-textarea"> <textarea placeholder="Message*" style="text-transform: none" name="titre_poster" required></textarea> </div> <br> <center> <p class="form-submit" style="margin-top:10px;"><input name="envoyer_musique" type="submit" class="submit btn-1 theme-bg" value="Envoyer"></p></center> </form>

Mammouth du PHP | 2703 Messages

18 nov. 2018, 20:18

pour le champ caché à ne pas remplir et masqué en css, je mettrais plutôt un nom très courant comme email.

Avatar du membre
Mammouth du PHP | 1564 Messages

19 nov. 2018, 11:50

Je ne sais pas installé recaptcha par contre je fait une vérif toute bête pour ne plus avoir se genre de message, j’interdis d'envoyer le formulaire si le message contient une URL

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

19 nov. 2018, 15:15

Quand tout le reste a échoué, lisez le mode d'emploi...

Gload
Invité n'ayant pas de compte PHPfrance

20 nov. 2018, 01:39

Bonsoir,

J'ai cherché la solution, du coup je fonctionne avec la variable stripos.
Par contre, elle fonctionne bien avec des lettres mais pas avec des chiffres...
Vu que les robots laissent des messages en objet avec des codes de ce style "4478755", je voudrais interdire les chiffres dans le champ objet.

Voici ma requête:

Code : Tout sélectionner

$un = "1"; $deux = "2"; $trois = "3"; $quatre = "4"; $cinq = "5"; $six = "6"; $sept = "7"; $huit = "8"; $neuf = "9"; if (stripos($_POST["objet_poster"], $un) || stripos($_POST["objet_poster"], $deux) || stripos($_POST["objet_poster"], $trois) || stripos($_POST["objet_poster"], $quatre) || stripos($_POST["objet_poster"], $cinq) || stripos($_POST["objet_poster"], $six) || stripos($_POST["objet_poster"], $sept) || stripos($_POST["objet_poster"], $huit) || stripos($_POST["objet_poster"], $neuf) === false) {
Mais ça ne fonctionne pas avec les chiffres.. uniquement avec des lettres.. pouvez-vous m'aider ?

Avatar du membre
Mammouth du PHP | 1564 Messages

20 nov. 2018, 08:30

C'est dommage d'interdire des chiffres car vous allez perdre des messages qui sont pas du spam.

Votre condition doit comporter des parenthèses (au tout début et avant "=== false"):
if ((stripos($_POST["objet_poster"], $un) || stripos($_POST["objet_poster"], $deux) || stripos($_POST["objet_poster"], $trois) || stripos($_POST["objet_poster"], $quatre) || stripos($_POST["objet_poster"], $cinq) || stripos($_POST["objet_poster"], $six) || stripos($_POST["objet_poster"], $sept) || stripos($_POST["objet_poster"], $huit) || stripos($_POST["objet_poster"], $neuf)) === false)	{ 
car là il me semble que vous faite que demander si
stripos($_POST["objet_poster"], $neuf) === false
au final
Modifié en dernier par two3d le 20 nov. 2018, 11:15, modifié 1 fois.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

20 nov. 2018, 10:12

Code : Tout sélectionner

$un = "1"; $deux = "2"; $trois = "3"; $quatre = "4"; $cinq = "5"; $six = "6"; $sept = "7"; $huit = "8"; $neuf = "9"; if (stripos($_POST["objet_poster"], $un) || stripos($_POST["objet_poster"], $deux) || stripos($_POST["objet_poster"], $trois) || stripos($_POST["objet_poster"], $quatre) || stripos($_POST["objet_poster"], $cinq) || stripos($_POST["objet_poster"], $six) || stripos($_POST["objet_poster"], $sept) || stripos($_POST["objet_poster"], $huit) || stripos($_POST["objet_poster"], $neuf) === false) {
Ouh là quelle horreur :-D
C'est le moment de regarder le fonctionnement de preg_match() et des expressions régulières pour remplacer tout ce code par 1 ligne : http://php.net/preg_match

Ensuite, sur le fond effectivement interdire les chiffres me semblent très radical comme approche
Quand tout le reste a échoué, lisez le mode d'emploi...