web-dev-qa-db-fra.com

Comment empêcher les robots de remplir automatiquement un formulaire?

J'essaie de mettre au point un mécanisme anti-spam suffisamment efficace pour empêcher les entrées générées automatiquement. J'ai lu que des techniques comme captcha, 1 + 1 =? Les choses fonctionnent bien, mais elles constituent également une étape supplémentaire empêchant l'utilisation rapide et gratuite de l'application (je ne cherche rien de tel, s'il vous plaît).

J'ai essayé de définir des champs cachés dans tous mes formulaires, avec display: none; Cependant, je suis certain qu'un script peut être configuré pour suivre cet identifiant de champ de formulaire sans simplement le remplir.

Avez-vous mis en place/connaissez-vous une bonne méthode anti-robots de remplissage de formulaires automatique? Peut-on faire quelque chose de manière transparente avec le traitement HTML ET/OU côté serveur et être (presque) à l'épreuve des balles? (sans JS comme on pourrait simplement le désactiver).

J'essaie de ne pas compter sur les sessions pour cela (c'est-à-dire compter combien de fois un bouton est cliqué pour éviter les surcharges).

95
Gal

Un moyen facile à mettre en œuvre, mais pas infaillible (en particulier pour les attaques "spécifiques") de résoudre le problème du courrier indésirable consiste à suivre le temps écoulé entre l'envoi du formulaire et le chargement de la page.

Les robots demandent une page, analysent la page et soumettent le formulaire. C'est rapide.

Les humains tapent une URL, chargent la page, attendent avant que la page ne soit entièrement chargée, font défiler l'écran, lisent le contenu, décident si le commentaire doit être rempli/rempli, il faut du temps pour le remplir et envoyer.

La différence de temps peut être subtile; et comment suivre cette heure sans cookies nécessite un moyen de base de données côté serveur. Cela peut avoir un impact sur les performances.
Vous devez également modifier le seuil de temps.

70
Pindatjuh

En fait, je trouve qu'un simple champ Honey Pot fonctionne bien. La plupart des robots remplissent le champ {tous} _ qu'ils voient, espérant ainsi contourner les validateurs de champ requis.

http://haacked.com/archive/2007/09/11/honeypot-captcha.aspx

Si vous créez une zone de texte, masquez-la en javascript, puis vérifiez que la valeur est vide sur le serveur, ce qui élimine 99% des robots existants et ne cause pas 99% de vos utilisateurs aucun frustration du tout. Les 1% restants dont le javascript est désactivé verront toujours la zone de texte, mais vous pouvez ajouter un message du type "Laissez ce champ vide" pour ces cas (si vous en tenez à vous).

(Notant également que si vous faites style = "display: none" sur le champ, il est trop facile pour un robot de le voir et de le supprimer, c'est pourquoi je préfère l'approche javascript).

70
Ben Scheirman

Et si - le Bot ne trouve aucune form du tout? 

3 exemples:

1. Insérez votre formulaire en utilisant AJAX

si vous êtes d'accord avec les utilisateurs ayant JS désactivé et ne pouvant pas voir/envoyer un formulaire ... Vous pouvez toujours les notifier en utilisant <noscript><p class="error">ERROR: The form could not be loaded. Please, re-enable JavaScript in your browser to fully enjoy our services.</p></noscript>. Que,

  1. Créez un form.html et placez votre form dans un élément <div id="formContainer">
  2. À l'intérieur de la page où vous devez appeler ce formulaire, utilisez un <div id="dynamicForm"></div> vide et ce jQuery:

$("#dynamicForm").load("form.html #formContainer");

2. Construisez votre formulaire entièrement en utilisant JS

// THE FORM
var $form = $("<form/>", {
  appendTo : $("#formContainer"),
  class    : "myForm",
  submit   : AJAXSubmitForm
});

// EMAIL INPUT
$("<input/>",{
  name        : "Email", // Needed for serialization
  placeholder : "Your Email",
  appendTo    : $form,
  on          : {        // Yes, the jQuery's on() Method 
    input : function() {
      console.log( this.value );
    }
  }
});

// MESSAGE TEXTAREA
$("<textarea/>",{
  name        : "Message", // Needed for serialization
  placeholder : "Your message",
  appendTo    : $form
});

// SUBMIT BUTTON
$("<input/>",{
  type        : "submit",
  value       : "Send",
  name        : "submit",
  appendTo    : $form
});

function AJAXSubmitForm(event) {
  event.preventDefault(); // Prevent Default Form Submission
  // do AJAX instead:
  var serializedData = $(this).serialize();
  alert( serializedData );
  $.ajax({
    url: '/mail.php',
    type: "POST",
    data: serializedData,
    success: function (data) {
      // log the data sent back from PHP
      console.log( data );
    }
  });
}
.myForm input,
.myForm textarea{
  font: 14px/1 sans-serif;
  box-sizing: border-box;
  display:block;
  width:100%;
  padding: 8px;
  margin-bottom:12px;
}
.myForm textarea{
  resize: vertical;
  min-height: 120px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="formContainer"></div>

3. _ {Bot-bait} _ entrée

des bots comme (vraiment comme) séduit des éléments en entrée comme:

<input
  type="text"
  name="email"
  id="email"
  placeholder="Your email"
  autocomplete="nope"
  tabindex="-1" />

ils seront heureux d'entrer une valeur comme ils le font [email protected]

que (après avoir utilisé le HTML ci-dessus), en utilisant CSS faire comme:

input[name=email]{ /* bait input */
    /*
         don't use display:none or visibility:hidden
         cause that will not fool the bot
    */
    position:absolute;
    left:-2000px;
}

maintenant que votre entrée n'est pas visible par l'utilisateur, attendez-vous à PHP que votre $_POST["email"]soit vide (sans valeur)! Sinon, ne soumettez pas le formulaire. 

Maintenant, tout ce que vous avez à faire est de créer une autre entrée comme <input name="sender" type="text" placeholder="Your email">après (!) La "bot-bait" entrée pour l'adresse e-mail de l'utilisateur.)

Remerciements:

Developer.Mozilla - Désactivation de l'auto-complétion du formulaire
StackOverflow - Ignore Tabindex

20
Roko C. Buljan

Ce que j'ai fait est d'utiliser un champ caché et de mettre l'horodatage dessus, puis de le comparer à l'horodatage sur le serveur utilisant PHP.

Si le délai était supérieur à 15 secondes (cela dépend de la taille de vos formulaires), il s'agissait d'un bot.

J'espère que cette aide

16
adnhack

Un moyen très efficace d’éliminer virtuellement le spam est d’avoir un champ de texte contenant du texte, tel que "Supprimer ce texte afin de soumettre le formulaire!". et ce texte doit être supprimé pour pouvoir soumettre le formulaire.

Lors de la validation du formulaire, ne soumettez pas le formulaire si le champ de texte contient le texte d'origine ou tout autre texte aléatoire. Les robots peuvent lire les noms de formulaire et remplir automatiquement les champs Nom et E-mail, mais ne savent pas s'ils doivent réellement supprimer du texte d'un certain champ pour pouvoir être soumis.

J'ai implémenté cette méthode sur notre site Web d'entreprise et cela a totalement éliminé le spam que nous recevions quotidiennement. Ça marche vraiment!

15
HawleyTronics

Pourquoi ne pas créer une zone de saisie de champ de texte de la même couleur que l’arrière-plan, qui doit rester vierge? Cela résoudra le problème d'un affichage de lecture de bot: aucun

11
Steve

http://recaptcha.net/

reCAPTCHA est un service gratuit antibot qui aide à numériser des livres

Il a été acquis par Google (en 2009):

Regarde aussi

8
Anantha Kumaran

Bon nombre de ces robots anti-spam ne sont que des scripts côté serveur qui parcourent le Web. Vous pouvez en combattre beaucoup en utilisant du javascript pour manipuler la demande de formulaire avant son envoi (c.-à-d. En définissant un champ supplémentaire basé sur une variable client). Ce n'est pas une solution complète et peut poser de nombreux problèmes (utilisateurs sans JavaScript, sur des appareils mobiles, etc.), mais cela peut faire partie de votre plan d'attaque.

Voici un exemple trivial ...

<script>
function checkForm()
{
    // When a user submits the form, the secretField's value is changed
    $('input[name=secretField]').val('goodValueEqualsGoodClient');

    return true;
}
</script>

<form id="cheese" onsubmit="checkForm">
<input type="text" name="burger">

<!-- Check that this value isn't the default value in your php script -->
<input type="hidden" name="secretField" value="badValueEqualsBadClient">

<input type="submit">
</form>

Quelque part dans votre script php ...

<?php

if ($_REQUEST['secretField'] != 'goodValueEqualsGoodClient')
{
    die('you are a bad client, go away pls.');
}

?>

En outre, les captcha sont excellents et constituent la meilleure défense contre le spam.

6
John Himmelman

Je suis surpris que personne n'ait encore mentionné cette méthode:

  • Sur votre page, incluez une petite image cachée.
  • Placez un cookie lorsque vous servez cette image.
  • Lors du traitement de la soumission du formulaire, recherchez le cookie.


Avantages:

  • pratique pour l'utilisateur et le développeur
  • semble être fiable
  • pas de JavaScript

Les inconvénients:

  • ajoute une requête HTTP
  • nécessite l'activation des cookies sur le client


Par exemple, cette méthode est utilisée par le plugin WordPress Cookies for Comments .

4
Gras Double

Avec l'émergence de navigateurs sans tête (comme phantomjs) qui peuvent imiter n'importe quoi, vous ne pouvez pas supposons que:

  • les robots collecteurs de spam n'utilisent pas le javascript,
  • vous pouvez suivre les événements de la souris pour détecter bot,
  • ils ne verront pas qu'un champ est caché visuellement,
  • ils n'attendront pas un moment donné avant de soumettre.

Si cela était vrai, ce n'est plus vrai.

Si vous ne voulez pas une solution conviviale, donnez-leur une belle "je suis un spammeur" bouton de soumission :

 <input type="submit" name="ignore" value="I am a spammer!" />
 <input type="image" name="accept" value="submit.png" alt="I am not a spammer" />

Bien sûr, vous pouvez jouer avec deux boutons d'image input[type=image], en modifiant l'ordre après chaque chargement, les variantes de texte, le contenu des images (et leur taille) ou la name des boutons; ce qui nécessitera un travail de serveur.

 <input type="image" name="random125454548" value="random125454548.png"
      alt="I perfectly understand that clicking on this link will send the
      e-mail to the expected person" />
 <input type="image" name="random125452548" value="random125452548.png"
      alt="I really want to cancel the submission of this form" />

Pour des raisons d'accessibilité, vous devez proposer une alternative textuelle correcte, mais je pense qu'une phrase longue est meilleure pour les utilisateurs de lecteurs d'écran que d'être considérée comme un bot.

3
Adam

Une méthode très simple consiste à fournir des champs tels que <textarea style="display:none;" name="input"></textarea> et à supprimer toutes les réponses contenant cette information.

Une autre approche consiste à générer l'intégralité du formulaire (ou uniquement les noms de champs) à l'aide de Javascript; peu de robots peuvent l'exécuter.

Quoi qu'il en soit, vous ne ferez pas grand chose contre les "bots" vivants de Taïwan ou de l'Inde, qui gagnent 0,03 dollar par lien posté et gagnent leur vie de cette façon.

2
SF.

J'ai une approche simple pour arrêter les spammeurs qui est efficace à 100%, du moins selon mon expérience, et évite l'utilisation de reCAPTCHA et des approches similaires. Je suis passé de près de 100 spams par jour sur les formulaires html de l'un de mes sites à zéro pour les 5 dernières années une fois que j'ai mis en œuvre cette approche.

Il fonctionne en tirant parti des fonctionnalités de messagerie ALIAS de la plupart des scripts de traitement de formulaire HTML (j'utilise FormMail.pl), ainsi que d'un "code" de soumission graphique, qui est facilement créé dans le plus simple des programmes graphiques. Un de ces graphiques comprend le code M19P17nH et l'invite "Veuillez saisir le code à gauche". 

Cet exemple particulier utilise une séquence aléatoire de lettres et de chiffres, mais j’ai tendance à utiliser des versions non anglaises de mots familiers à mes visiteurs (par exemple, "pnofrtay"). Notez que l'invite du champ de formulaire est intégrée au graphique plutôt que d'apparaître sur le formulaire. Ainsi, pour un robot, ce champ de forme ne présente aucun indice quant à son objectif.

La seule astuce consiste à vérifier que votre formulaire html attribue ce code à la variable "destinataire". Ensuite, dans votre programme de messagerie, assurez-vous que chaque code que vous utilisez est défini comme un alias de messagerie, qui pointe sur l'adresse de messagerie que vous souhaitez utiliser. Comme il n’existe aucun type d’invite à lire pour un robot et aucune adresse électronique, il n’a aucune idée de ce qu’il faut mettre dans le champ de formulaire vierge. S'il ne met rien dans le champ de formulaire ou quoi que ce soit sauf des codes acceptables, la soumission du formulaire échoue avec une erreur "destinataire incorrect". Vous pouvez utiliser un graphique différent sur différentes formes, bien que cela ne soit pas vraiment nécessaire. 

Bien entendu, un être humain peut résoudre ce problème en un éclair, sans tous les problèmes associés à reCAPTCHA et à des systèmes similaires, plus élégants. Si un spammeur humain réagit à l'échec du destinataire et programme le code de l'image dans le robot, vous pouvez le changer facilement, une fois que vous réalisez que le robot a été codé en dur pour répondre. En cinq ans d'utilisation de cette approche, je n'ai jamais reçu de spam d'aucun des formulaires sur lesquels je l'utilise ni de plainte d'aucun utilisateur humain des formulaires. Je suis certain que cela pourrait être battu avec la capacité d'OCR dans le robot, mais cela ne s'est jamais produit sur aucun de mes sites utilisant des formulaires HTML. J'ai également utilisé à bon escient les "pièges à spam" (code html caché "qui vient ici" qui indique mes règles anti-spam), mais leur efficacité n'a été que d'environ 90%.

2
user2643367

Je pense à beaucoup de choses ici:

  1. utiliser JS (bien que vous ne le vouliez pas) pour suivre le déplacement de la souris, appui sur une touche, clic de souris
  2. obtenir l'URL de référence (qui dans ce cas devrait être une du même domaine) ... l'utilisateur normal doit naviguer sur le site Web avant d'atteindre le formulaire de contact: PHP: Comment obtenir l'URL de référence?
  3. utiliser une variable $ _SESSION pour acquérir l'adresse IP et vérifier le formulaire à envoyer par rapport à cette liste d'adresses IP
  4. Remplissez un champ de texte avec un texte factice que vous pouvez vérifier côté serveur s'il a été écrasé
  5. Vérifiez la version du navigateur: http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html ... Il est clair qu'un bot n'utilisera pas de navigateur mais juste un script.
  6. Utilisez AJAX pour envoyer les champs un par un et vérifier la différence de temps entre les envois.
  7. Utilisez une fausse page avant/après le formulaire, juste pour envoyer une autre entrée
1
valicu2000

J'ai ajouté une vérification de mon temps à mes formulaires. Les formulaires ne seront pas soumis s'ils sont remplis en moins de 3 secondes et cela fonctionnait très bien pour moi, en particulier pour les formulaires longs. Voici la fonction de vérification de formulaire que j'appelle sur le bouton d'envoi 

function formCheck(){
var timeStart; 
var timediff;

$("input").bind('click keyup', function () {
    timeStart = new Date().getTime();          
}); 
 timediff= Math.round((new Date().getTime() - timeStart)/1000);

  if(timediff < 3) { 
    //throw a warning or don't submit the form 
  } 
  else submit(); // some submit function

}
0
Harika Y

Avec des robots de spam de plus en plus sophistiqués et des techniques telles que les navigateurs automatisés, il deviendra plus difficile de déterminer la source du spam. Mais qu’il s’agisse d’un logiciel, d’un humain ou des deux, le spam est un spam en raison de son contenu. Je pense que la meilleure solution consiste à exécuter le contenu publié via une API anti-spam telle que Cleantalk ou Akismet. C'est relativement bon marché et efficace et ne gêne pas l'utilisateur. Vous pouvez vérifier les heures de soumission des formulaires et les autres vérifications traditionnelles des robots moins sophistiqués avant d'appuyer sur l'API.

0
nmit026

le moyen le plus simple que j'ai trouvé est de mettre un champ avec une valeur et de demander à l'utilisateur de supprimer le texte dans ce champ. puisque les bots ne les remplissent que. si le champ n'est pas vide, cela signifie que l'utilisateur n'est pas humain et qu'il ne sera pas posté. c'est le même but d'un code captcha.

0
matthew

C'est juste une idée, id utilisé dans mon application et qui fonctionne bien

vous pouvez créer un cookie sur les mouvements de la souris avec javascript ou jquery et vérifier du côté du serveur s'il existe un cookie, car seuls les humains ont un souris, ce cookie ne peut être créé que par eux.

0
h0mayun

En fait, le piège avec display: none fonctionne à merveille. Il est utile de déplacer la déclaration CSS dans un fichier contenant toutes les feuilles de style globales, ce qui obligerait les robots collecteurs de spam à les charger également (une déclaration directe style = "display: none;" pourrait probablement être interprétée par un bot de spam. , tout comme une déclaration de style local dans le document lui-même).

Cette combinaison avec d’autres contre-mesures devrait dissuader les robots collecteurs de spam de décharger leurs ordures (j’ai un livre d’or sécurisé avec diverses mesures et, jusqu’à présent, ils sont tombés dans le piège de mes principaux pièges. Toutefois, si un bot les contournait, les autres sont-ils prêts à se déclencher).

Ce que j'utilise, c’est une combinaison de faux formulaires (également décrits comme des champs non valides au cas où un navigateur est utilisé, mais ne gère pas les CSS en général ou display: none en particulier), des contrôles de validité (c’est-à-dire le format de l’entrée valide?), horodatage (envois trop rapides et trop lents), MySQL (pour la mise en place de listes noires basées sur des adresses e-mail et IP ainsi que des filtres de filtrage), DNSBL (par exemple, SBL + XBL de Spamhaus) , analyse de texte (par exemple, des mots qui constituent une indication forte du spam) et courriers électroniques de vérification (pour déterminer si l'adresse de courrier électronique fournie est valide ou non).

Une remarque sur les e-mails de vérification: cette étape est tout à fait facultative, mais lorsque vous choisissez de la mettre en œuvre, ce processus doit être aussi simple à utiliser que possible (c’est-à-dire qu’il faut cliquer sur un lien contenu dans l’e-mail. ) et faire en sorte que l’adresse e-mail en question soit inscrite sur la liste blanche pendant un certain temps afin d’éviter les vérifications ultérieures au cas où cet utilisateur souhaite créer des publications supplémentaires.

0
Robidu

Une autre option au lieu de faire des lettres et des chiffres aléatoires comme le font de nombreux sites Web, est de faire des images aléatoires d'objets reconnaissables. Ensuite, demandez à l'utilisateur de taper soit de quelle couleur est quelque chose dans l'image, ou ce qu'est l'objet lui-même.

Dans l’ensemble, chaque solution aura ses avantages et ses inconvénients. Vous allez devoir trouver une bonne moyenne entre trop de difficultés pour que les utilisateurs transmettent le mécanisme antispam et le nombre de robots anti-spam pouvant passer.

0
Brian

Les robots ne peuvent pas exécuter JavaScript. Vous devez donc injecter du code JavaScript dans la page, puis détecter sa présence avant la soumission du formulaire, mais méfiez-vous, car certains de vos utilisateurs verront également le code JavaScript désactivé.

Autrement, je pense que vous serez obligé d'utiliser une forme de preuve d'humanité

0
Nick Allen

Il existe un tutoriel about this sur le site JQuery. Bien qu'il s'agisse de JQuery, l'idée est indépendante du cadre.

Si JavaScript n'est pas disponible, vous devrez peut-être recourir à l'approche de type CAPTCHA.

0
Pool
  1. J'utilise une méthode où il y a une zone de texte cachée. Depuis que les robots analysent le site, ils le remplissent probablement. Ensuite, je vérifie s'il est vide s'il ne s'agit pas d'un site Web.

  2. Ajouter une vérification de courrier électronique. L'utilisateur reçoit un courrier électronique et doit cliquer sur un lien. Sinon, jetez le message dans un certain temps.

0
cookie

D'après mon expérience, si le formulaire est juste un formulaire de "contact", vous n'avez pas besoin de mesures spéciales. Les spams sont filtrés décemment par les services de messagerie Web (vous pouvez suivre les demandes de formulaire Web via des scripts de serveur pour savoir ce qui parvient effectivement à votre courrier électronique. Bien entendu, je suppose que vous disposez d'un bon service de messagerie Web: D)

Btw j'essaie de ne pas compter sur les sessions pour cela (comme, en comptant comment Plusieurs fois, un bouton est cliqué pour éviter les surcharges).

Je ne pense pas que ce soit une bonne chose. En effet, ce que je veux réaliser, c’est recevoir des courriels d’utilisateurs qui font une action particulière, car ce sont les utilisateurs qui me intéressent (par exemple, les utilisateurs qui ont consulté la page "CV" et qui ont utilisé le contact approprié forme). Donc, si l'utilisateur fait quelque chose que je veux, je commence à suivre sa session et mets un cookie (je mets toujours un cookie de session, mais si je ne démarre pas de session, il ne s'agit que d'un faux cookie conçu pour croire que l'utilisateur a une session). Si l'utilisateur fait quelque chose de indésirable, je ne me soucie pas de lui garder une session, donc pas de surcharge, etc.

De plus, il serait bien pour moi que les services de publicité offrent une sorte d'API (peut-être déjà existante) pour voir si l'utilisateur "regarde l'annonce", il est probable que les utilisateurs qui regardent les annonces sont de vrais utilisateurs, mais s'ils ne le sont pas vraiment bien au moins vous obtenez 1 vue de toute façon, donc rien à perdre. (et croyez-moi, les contrôles des publicités sont plus sophistiqués que tout ce que vous pouvez faire seul)

0
GameDeveloper

La meilleure solution que j'ai trouvée pour éviter d'être spammé par des robots consiste à utiliser une question ou un champ très trivial dans votre formulaire.

Essayez d'ajouter un champ comme celui-ci:

  • Copiez "bonjour" dans la boîte
  • 1 + 1 =?
  • Copiez le nom du site dans la boîte

Ces astuces nécessitent que l'utilisateur comprenne ce qui doit être entré dans le formulaire, ce qui rend beaucoup plus difficile d'être la cible d'un remplissage de formulaire massif par un bot.

MODIFIER

Comme vous l'avez dit dans votre question, le verso de cette méthode est l'étape supplémentaire permettant à l'utilisateur de valider son formulaire . Mais, à mon avis, il est beaucoup plus simple qu'un captcha et le temps système nécessaire pour le remplir n'est pas plus de 5 secondes, ce qui semble acceptable du point de vue de l'utilisateur.

0
Thibault Falise

Utilisez 1) le formulaire avec les jetons 2) Vérifiez le formulaire pour former le retard avec l'adresse IP 3) Bloquer l'IP (facultatif)

0
Vivian

Vous pouvez essayer de tromper les robots de spam en ajoutant l'attribut d'action correct après la validation Javascript . Ainsi, si le robot bloque JavaScript, il ne soumet jamais correctement le formulaire.

HTML

<form id="form01" action="false-action.php">
    //your inputs
    <button>SUBMIT</button>
</form>

_ JAVASCRIPT

$('#form01 button').click(function(){

   //your Validations and if everything is ok: 

    $('#form01').attr('action', 'correct-action.php').on("load",function(){
        document.getElementById('form01').submit()
    });
})

J'ajoute un "rappel" après .attr () pour éviter les erreurs

0
Santi Nunez