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

105

J'essaie de trouver un mécanisme anti-spam suffisamment bon pour empêcher les entrées générées automatiquement. J'ai lu ces techniques comme le captcha, 1 + 1 =? les trucs fonctionnent bien, mais ils présentent é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 certains 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 et simplement ne pas le remplir.

Avez-vous mis en œuvre / connaissez-vous une bonne méthode anti-robots de remplissage automatique de formulaires? Y a-t-il quelque chose qui peut être fait de manière transparente avec le traitement côté serveur HTML ET / OU, et être (presque) à l'épreuve des balles? (sans JS car on pourrait simplement le désactiver).

J'essaie de ne pas me fier aux sessions pour cela (c'est-à-dire en comptant le nombre de clics sur un bouton pour éviter les surcharges).

Fille
la source
5
Merci de ne pas vouloir de solutions captcha! OMI, le spam de forme est un problème pour les propriétaires de sites et l'empêcher n'est pas un fardeau que l'utilisateur devrait supporter. Il y a beaucoup trop de façons alternatives de traiter le spam sur le site, comme en témoignent les réponses ici. Les méthodes nécessitant une interaction de l'utilisateur ne doivent être utilisées que par les paresseux ou les novices.
Mike

Réponses:

73

Un moyen facile à mettre en œuvre mais pas infaillible (en particulier sur les attaques «spécifiques») de résoudre les anti-spam consiste à suivre le temps entre la soumission 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 saisissent une URL, chargent la page, attendent que la page soit complètement chargée, défilent vers le bas, lisent le contenu, décident de commenter / remplir le formulaire, ont besoin de temps pour remplir le formulaire et soumettre.

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

Pindatjuh
la source
9
Faites attention si vous souhaitez autoriser les utilisateurs finaux à utiliser des remplisseurs de formulaires automatiques tels que addons.mozilla.org/en-US/firefox/addon/1882 qui peuvent permettre une soumission très rapide. En plus de captcha, tout ce qui ennuie l'utilisateur final n'est généralement pas bon, et surtout lorsqu'il empêche une personne en colère d'aller (très) vite.
flocon de neige
1
Bon point, mais tout dépend du contexte. Si le formulaire est un formulaire de connexion, je suis entièrement d'accord avec vous. Mais pourquoi désactiver la connexion des bots? Si le contexte est une zone de commentaire, comme celle-ci sur StackOverflow, je le sais avec certitude: si vous utilisez le remplissage automatique sur une zone de commentaire, vous êtes un spammeur. Notez que si vous utilisez le remplissage automatique pour les signatures, vous avez encore besoin de temps pour saisir le contenu.
Pindatjuh
5
Notez que SO fait quelque chose comme ça. Modifiez un commentaire trop vite ou trop de fois de suite et vous obtiendrez le message "Êtes-vous un humain?" page.
Jakob Borg
2
Les pirates ne demandent pas toujours le formulaire. Parfois, une URL soigneusement conçue (en utilisant GET ou POST) sera suffisante pour publier le formulaire plusieurs fois avec peu d'effort.
crafter
1
Implémentez ceci avec captcha. Si le formulaire a été soumis trop rapidement, présentez un captcha pour permettre aux utilisateurs authentiques de passer.
Yashovardhan99
75

En fait, je trouve qu'un simple champ Honey Pot fonctionne bien. La plupart des robots remplissent tous les champs de formulaire qu'ils voient, dans l'espoir de contourner les validateurs de champs 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, cela élimine 99% des robots et ne cause aucune frustration à 99% de vos utilisateurs . Les 1% restants dont le javascript est désactivé verront toujours la zone de texte, mais vous pouvez ajouter un message comme "Laissez ce champ vide" pour ces cas (si vous vous en souciez du tout).

(De plus, en notant que si vous faites style = "display: none" sur le terrain, alors il est trop facile pour un robot de simplement voir cela et de rejeter le champ, c'est pourquoi je préfère l'approche javascript).

Ben Scheirman
la source
1
Pensez-vous que les bots parcourent le fichier css et comprennent qu'il affiche: aucun; ? Je préfère vraiment ne pas utiliser une solution basée sur JS, car elle peut être facilement désactivée.
Gal
1
Cela semble être une vieille solution pour les webmasters incluant des tonnes de mots clés non pertinents afin de booster leur webranking. Je pense que les robots d'exploration de recherche tels que ceux de Google peuvent comprendre que c'est un affichage: aucun. Pourquoi d'autres robots ne pourraient-ils pas faire cela?
flocon de neige
2
J'ai utilisé cette technique maintenant sur deux sites qui étaient martelés et les inscriptions de bot sont maintenant à zéro 0 sur les deux. Cela n'aidera pas contre les attaques ciblées, mais la plupart recherchent de toute façon des exploits ou du spam.
nirvdrum
25
Petit point ici: pour contourner le problème JS, utilisez simplement CSS pour positionner votre entrée de pot de miel au - dessus du haut de la page - de cette façon, il sera correct d'avoir js désactivé, et pour le contourner, le bot devra être capable d'analyser CSS positionnement absolu et prendre une décision de bon sens quant à savoir s'il s'agit d'un pot de miel ou non. un peu plus à l'épreuve des balles de cette façon :)
totalementNotLizards
3
@ alexy13 oui, c'est plus simple, mais comme indiqué dans la réponse, il est également beaucoup plus facile pour un bot de comprendre ce que vous essayez de faire, il suffit de tester une propriété CSS. Si, cependant, vous utilisez la stratégie de positionnement absolu, le bot doit analyser toutes vos règles de positionnement et les règles de la plupart des parents de l'élément pour être en mesure de déterminer si l'entrée serait visible ou non, puis de déterminer si ou ne pas agir sur ces informations - ce qui est plus problématique que cela ne vaut la peine pour la plupart (sinon tous) des robots.
TotallyNotLizards
22

Et si - le Bot n'en trouve pas formdu tout?

3 exemples:

  1. Insérez votre formulaire avec AJAX
  • Si vous êtes d'accord avec les utilisateurs ayant désactivé JS et ne pouvant pas voir / soumettre un formulaire, vous pouvez les avertir et leur demander d'activer Javascript en utilisant d'abord une instruction noscript:
<noscript>
  <p class="error">
    ERROR: The form could not be loaded. Please enable JavaScript in your browser to fully enjoy our services.
  </p>
</noscript>
  • Créez un form.htmlet placez votre à l' formintérieur d'un <div id="formContainer">élément.

  • À l'intérieur de la page où vous devez appeler ce formulaire, utilisez un vide <div id="dynamicForm"></div>et ce jQuery:$("#dynamicForm").load("form.html #formContainer");

  1. Créez votre formulaire entièrement à l'aide de 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>

  1. Entrée de bot-appât
  • Les robots aiment ( vraiment ) les éléments d'entrée coquins comme:
<input 
  type="text"
  name="email"
  id="email"
  placeholder="Your email"
  autocomplete="nope"
  tabindex="-1"
They wll be happy to enter some value such as
`[email protected]`
  • Après avoir utilisé le HTML ci-dessus, vous pouvez également utiliser CSS pour ne pas afficher l'entrée:
input[name=email]{ /* bait input */
  /* do not use display:none or visibility:hidden
     that will not fool the bot*/
  position:absolute;
  left:-2000px;
}
  • Maintenant que votre entrée n'est pas visible pour l'utilisateur, attendez en PHP que votre $_POST["email"] soit vide (sans aucune valeur)! Sinon, ne soumettez pas le formulaire.
  • Enfin, tout ce que vous devez faire est de créer une autre entrée comme <input name="sender" type="text" placeholder="Your email"> après (!) Le « bot-appât » entrée pour l'utilisateur réelle adresse e - mail.

Remerciements:

Developer.Mozilla - Désactivation de la saisie semi- automatique des formulaires
StackOverflow - Ignorer Tabindex

Roko C. Buljan
la source
7
Le navigateur d'un utilisateur légitime pourrait-il potentiellement voir le champ de saisie de l'appât comme un champ de courrier électronique et le remplir automatiquement lorsque l'utilisateur choisit de remplir automatiquement le reste du formulaire? L'utilisateur ne verrait pas qu'un champ éloigné de l'écran avait été rempli, et ils ressembleraient toujours à un robot.
wilbbe01
Je soupçonne que autocomplete=nopeserait par défaut on;-) MDN: input # attr-autocomplete
gérer le
@handle ça n'a pas d'importance, c'est une entrée d'appât de bot. Vous pouvez écrire autocomplete="oh sunny day"d'ailleurs.
Roko C. Buljan
19

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

Si c'était plus rapide que 15 secondes (dépend de la taille de vos formulaires), c'était un bot.

J'espère que cette aide

adnhack
la source
1
Bonne idée, cependant, je fixerais la limite à environ 3 à 5 secondes pour permettre aux utilisateurs rapides / puissants. J'utilise cette même approche, et fixer une limite sur mes formulaires à 3 secondes a filtré 99% des robots.
Kayla
@adnhack Voulez-vous dire quelque chose comme: 1) lors du chargement de la page avec php, obtenez l'heure du serveur et créez une session. 2) l'utilisateur ou le bot remplit le formulaire, clique sur Soumettre, avec $.posttout envoyer vers un fichier php externe. 3) en php externe, obtenir à nouveau l'heure du serveur et la comparer avec l'heure de la session?
Andris
16

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

Lors de la validation du formulaire, si le champ de texte contient le texte d'origine, ou tout autre texte aléatoire d'ailleurs, ne soumettez pas le formulaire. Les robots peuvent lire les noms de formulaires 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 le soumettre.

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!

HawleyTronics
la source
Intéressant, savez-vous si c'est plus efficace que les autres réponses ... une zone de texte cachée ou le suivi du temps qu'il faut pour remplir le formulaire?
Austin Henley
4
Cela attraperait également les utilisateurs qui ne peuvent pas suivre les instructions, ce qui peut ne pas être souhaité.
wilbbe01
J'aime ça! Jusqu'à ce que le bot commence à essayer différentes combinaisons de champs vides et remplis ... la meilleure façon de tester est de l'implémenter et de scanner avec l'un de ceux-ci: sectoolmarket.com
...
Efficace dans la mesure où la personne qui gère le bot ne le découvre pas et modifie le code.
Talha Awan
11

Que diriez-vous de créer une zone de saisie de champ de texte de la même couleur que l'arrière-plan qui doit rester vide. Cela contournera le problème de l'affichage de la lecture d'un bot: aucun

Steve
la source
2
Ajoutez ceci comme commentaire s'il vous plaît lorsque vous obtenez plus de réputation au lieu d'une réponse;)
Rob
3
Cela pose des problèmes d'accessibilité. L'index du pot de miel ne sera pas masqué aux utilisateurs disposant de lecteurs d'écran.
Otterfan
5
Je suis un utilisateur aveugle, et j'ai trouvé un champ de formulaire comme celui-ci une fois, et l'étiquette au-dessus se lisait: "Si vous voyez ceci, laissez ce champ vide." IMO très efficace.
Parham Doustdar le
8

http://recaptcha.net/

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

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

Regarde aussi

Anantha Kumaran
la source
5
En tant qu'utilisateur, je trouve que recaptcha est souvent difficile à comprendre. Certains mots sont si difficiles à lire que vous devez essayer 3 ou 4 fois. Bien que cela aidera certainement à résoudre le problème des robots.
Brian
Ce que Brian a dit et: yro.slashdot.org/story/10/03/02/0135238/…
SF.
Je me suis retrouvé sur cette page car CAPTCHA / reCAPTCHA n'arrête pas actuellement la soumission du formulaire de bot. C'est 5 ans plus tard et c'est une nouvelle technique que lorsque cette réponse a été donnée
JohnnyFaldo
Je suis étonné de savoir pourquoi cette réponse n'a pas plus de votes positifs. que l'utilisateur aime ou non, c'est une excellente solution. Surtout s'il n'est utilisé que pour le formulaire d'inscription.
towi_parallelism
Ces jours-ci, recaptcha commence par une simple case à cocher, peut-être que ce n'est pas aussi douloureux qu'avant? ...
rogerdpack
6

Beaucoup de ces robots anti-spam ne sont que des scripts côté serveur qui rôdent sur le Web. Vous pouvez combattre beaucoup d'entre eux en utilisant du javascript pour manipuler la demande de formulaire avant son envoi (c'est-à-dire en définissant un champ supplémentaire basé sur une variable client). Ce n'est pas une solution complète et peut entraîner de nombreux problèmes (par exemple, les utilisateurs sans JavaScript, sur les 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.');
}

?>

De plus, les captchas sont excellents et constituent vraiment la meilleure défense contre le spam.

John Himmelman
la source
Merci, bien que javascript puisse être facilement désactivé dans n'importe quel navigateur, annihilant ainsi mon "mécanisme anti-spam", donc je cherche quelque chose de plus global.
Gal
Je me trompe peut-être, mais cela ne dirait-il pas à tous les utilisateurs désactivés par JS «vous êtes un mauvais client, allez-y pls.»?
Gal
Gal, c'est un exemple trivial , qui montre simplement comment valider une requête var définie par js côté client.
John Himmelman
Les Captcha @John Himmelman sont résolubles et ne constituent pas nécessairement la meilleure défense contre le spam. Il existe des services payants comme anti-captcha.com qui résoudront les captchas de formulaire pour une somme modique.
Le problème avec cette approche est que j'ai vu beaucoup de robots utiliser PhantomJS. Cela leur permettrait de passer.
Parham Doustdar le
4

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

  • Sur votre page, ajoutez une petite image masquée.
  • Placez un cookie lors de la diffusion de cette image.
  • Lors du traitement de l'envoi 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 que les cookies soient activés sur le client


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

Gras Double
la source
Les bots qui utilisent des trucs comme PhantomJS ne contourneraient-ils pas facilement cela?
Parham Doustdar le
1
Comme il s'agit d'un moteur de navigateur complet, qui charge des actifs et autres, oui, cela devrait être possible. Pourtant, je ne suis pas sûr qu'il soit souvent utilisé pour un robot de spam, car il est probablement beaucoup plus lent que les scripts cURL.
Gras Double le
une raison pour laquelle ce serait mieux qu'un jeton CSRF?
xenoterracide
1
un jeton CSRF n'arrêtera pas du tout un bot. 1ère demande, OBTENEZ le formulaire, qui comprend le jeton. 2ème demande, POSTER le formulaire, y compris le jeton.
Gras Double
4

Avec l'émergence de navigateurs headless (comme phantomjs) qui peuvent émuler n'importe quoi, vous ne pouvez pas supposer que:

  • les robots anti-spam n'utilisent pas de javascript,
  • vous pouvez suivre les événements de la souris pour détecter le bot,
  • ils ne verront pas qu'un champ est visuellement masqué,
  • ils n'attendront pas un certain temps avant de se soumettre.

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

Si vous ne voulez pas de solution conviviale, donnez-leur simplement un beau bouton d' envoi "Je suis un spammeur" :

 <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 input[type=image]boutons d' image , en changeant l'ordre après chaque chargement, les alternatives de texte, le contenu des images (et leur taille) ou le namedes boutons; ce qui nécessitera un certain 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 mettre une alternative textuelle correcte, mais je pense qu'une longue phrase est meilleure pour les utilisateurs de lecteurs d'écran que d'être considérée comme un bot.

Note supplémentaire: ces exemples illustrent que comprendre l'anglais (ou n'importe quelle langue), et devoir faire un choix simple, est plus difficile pour un spambot que: attendre 10 secondes, manipuler CSS ou javascript, savoir qu'un champ est caché, émuler un mouvement de souris ou émulation de la saisie au clavier, ...

Adam
la source
Il me semble que le fait même que vous deviez mettre le texte alternatif signifie que votre solution à deux images est tout aussi sensible au script que les autres alternatives. Et pour le bouton "Je ne suis pas un spammeur": cela ne peut-il pas être scripté aussi?
Hawkeye
@Hawkeye Ma réponse a été qu'un navigateur sans tête peut émuler n'importe quoi : javascript, retards, déplacement de la souris, champs cachés, ... Le terme «beau» avant mes exemples était plutôt «sarcastique». Mais ces exemples illustrent que comprendre l'anglais, et devoir faire un choix simple, est plus difficile pour un spambot que: attendre 10 secondes, manipuler CSS ou javascript, savoir qu'un champ est caché, émuler le mouvement de la souris ou émuler la frappe du clavier, ...
Adam
Je vois votre point maintenant. Ajoutez peut-être la dernière déclaration «Mais ces exemples illustrent…» etc. à votre réponse. Parce que ça m'a aidé à comprendre ce que tu veux dire. Cela semblait au début être un argument contradictoire selon lequel "nous ne pouvons pas supposer que les robots ne peuvent pas ...", mais ensuite énumérer les choses que nous ne pouvons toujours pas supposer que les robots ne peuvent pas faire. Mais le nœud de votre argument est que votre exemple (devoir faire un choix sur le bouton d'envoi) est plus difficile - ce qui (maintenant que je comprends) est une réponse brillante. +1
Hawkeye
3

Un moyen très simple consiste à fournir certains champs comme <textarea style="display:none;" name="input"></textarea>et à supprimer toutes les réponses qui ont rempli ce champ .

Une autre approche consiste à générer le formulaire entier (ou juste les noms de champs) en utilisant Javascript; peu de robots peuvent l'exécuter.

Quoi qu'il en soit, vous ne ferez pas grand-chose contre les «bots» vivants de Taiwan ou d'Inde, qui sont payés 0,03 $ par lien publié, et qui gagnent leur vie de cette façon.

SF.
la source
2
Je sais que cette réponse a presque 7 ans, mais je pense que cela vaut la peine d'être commenté. De nombreux robots peuvent être programmés pour ignorer les champs avec un style = "display: none" pour éviter ce type de protection.
Kenny Johnson
Il existe des dizaines de méthodes pour masquer les entrées, en utilisant Javascript, en affichant des éléments factices au-dessus d'eux, en les déplaçant hors de la zone visible, en les stylisant pour se fondre parfaitement avec les décorations d'arrière-plan ou de mise en page, etc. of hashed => original dans la session côté serveur) aidera à éviter d'utiliser les noms comme indices et de mapper manuellement les entrées valides. Quoi qu'il en soit, il n'y a aucune défense contre le spam manuel.
SF.
2

J'ai une approche simple pour arrêter les spammeurs qui est efficace à 100%, du moins d'après 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 l'un des formulaires html de mes sites à zéro au cours des 5 dernières années une fois que j'ai implémenté cette approche.

Il fonctionne en tirant parti des capacités d'e-mail ALIAS de la plupart des scripts de gestion de formulaires html (j'utilise FormMail.pl), avec 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 entrer 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 pour le champ de formulaire est intégrée au graphisme, plutôt que d'apparaître sur le formulaire. Ainsi, pour un robot, ce champ de formulaire ne présente aucun indice quant à son objectif.

La seule vraie astuce ici est de s'assurer 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 vers les adresses de messagerie que vous souhaitez utiliser. Puisqu'il n'y a aucune invite d'aucune sorte sur le formulaire pour un robot à lire et aucune adresse e-mail, 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 "mauvais destinataire". Vous pouvez utiliser un graphique différent sur différents formulaires, bien que ce ne soit pas vraiment nécessaire dans mon expérience.

Bien sûr, un être humain peut résoudre ce problème en un éclair, sans tous les problèmes associés à reCAPTCHA et à des schémas similaires, plus élégants. Si un spammeur humain répond à l'échec du destinataire et programme le code d'image dans le robot, vous pouvez le modifier facilement, une fois que vous vous rendez compte 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 provenant d'aucun des formulaires sur lesquels je l'utilise et je n'ai jamais eu de plainte d'un utilisateur humain des formulaires. Je suis certain que cela pourrait être battu avec la capacité OCR dans le robot, mais je ne l'ai jamais fait sur aucun de mes sites qui utilisent des formulaires html. J'ai également utilisé des "pièges anti-spam" (code html "come hither" caché qui pointe vers mes politiques anti-spam) à bon escient, mais ils n'étaient efficaces qu'à environ 90%.

user2643367
la source
1

Je pense à beaucoup de choses ici:

  1. en utilisant JS (bien que vous ne le vouliez pas) pour suivre le mouvement de la souris, la pression d'une touche, le clic de la souris
  2. obtenir l'url de référence (qui dans ce cas devrait être celle 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 soumis par rapport à cette liste d'adresses IP
  4. Remplissez un champ de texte avec du 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 un 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 soumissions
  7. Utilisez une fausse page avant / après le formulaire, juste pour envoyer une autre entrée
valicu2000
la source
Pourriez-vous élaborer sur certaines de ces étapes valicu2000? Sont-ils toujours valables en 2020? Merci.
Michael Moriarty
0

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 saisir la couleur de quelque chose dans l'image ou l'objet lui-même.

Dans l'ensemble, chaque solution aura ses avantages et ses inconvénients. Vous allez devoir trouver une médiane heureuse entre le fait que les utilisateurs aient trop de mal à passer le mécanisme antispam et le nombre de robots de spam qui peuvent passer.

Brian
la source
Bonne idée. Je n'utiliserais pas la couleur comme critère, car cela pourrait exclure les utilisateurs de daltoniens
Neil Aitken
Oui, bon point. En fait, un problème avec les images en général est qu'elles ne sont pas accessibles, et en les rendant «accessibles» avec des balises alt, les robots peuvent facilement les comprendre.
Brian
Les images sont toujours une mauvaise idée ... le texte peut à peine être lu, j'ai rencontré ce problème avec d'autres sites Web
valicu2000
C'est juste un captcha avec une très petite torsion qui rend plus difficile pour les utilisateurs. De plus, il n'est pas du tout accessible.
Mihai P.
0

Les robots ne peuvent pas exécuter JavaScript, vous faites donc quelque chose comme injecter une sorte d'élément caché dans la page avec JavaScript, puis détecter sa présence avant la soumission du formulaire, mais méfiez-vous car certains de vos utilisateurs auront également JavaScript désactivé

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

Nick Allen
la source
4
Les robots intelligents peuvent exécuter du javascript. En faisant une solution javascript, vous
bloquez
Si le bot est un plugin de navigateur, il sera capable d'exécuter du javascript et de voir les choses que l'utilisateur voit (même si vous effectuez un rendu flash ou webgl)
CoffeDeveloper
Utilisez simplement CSS pour placer le champ de texte au-dessus de la page si vous craignez que des personnes aient désactivé JavaScript.
Chewie The Chorkie
0

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 sur votre formulaire.

Essayez d'ajouter un champ comme celui-ci:

  • Copiez "bonjour" dans la boîte de côté
  • 1 + 1 =?
  • Copiez le nom du site Web dans la boîte

Ces astuces nécessitent que l'utilisateur comprenne ce qui doit être saisi sur le formulaire, ce qui rend beaucoup plus difficile d'être la cible d'un remplissage massif de formulaires par des robots.

ÉDITER

L'arrière de cette méthode, comme vous l'avez indiqué dans votre question, est l'étape supplémentaire pour l'utilisateur de valider son formulaire. Mais, à mon avis, c'est beaucoup plus simple qu'un captcha et la surcharge lors du remplissage du formulaire ne dépasse pas 5 secondes, ce qui semble acceptable du point de vue de l'utilisateur.

Thibault Falise
la source
En tant qu'utilisateur, je déteste cette merde. Je comprends que le spam est un problème, mais comment est-ce mon problème, en tant qu'utilisateur du site? Le spam de commentaires est un problème pour le propriétaire du site, et en tant que tel, l'utilisateur ne devrait pas prendre le fardeau de l'empêcher. Si vous entrez dans un magasin et que l'on vous demande de mettre des chaussons de protection sur vos chaussures parce qu'ils ne veulent pas passer la vadrouille, que pensez-vous alors? Cela ne prend que quelques secondes, mais ce n'est pas votre fardeau à porter.
Mike
@Miki spam fait perdre du temps à un propriétaire de site. Le temps c'est de l'argent, ce que je vends vous coûtera plus cher. Votre argument peut facilement être utilisé pour dire que "je m'en fiche que vous ayez à payer un loyer, je veux payer le coût de production + 1 $. Comment payez-vous le loyer mon problème". Lorsque vous achetez quelque chose que vous payez pour l'hébergement, le transport, le temps, etc.
Mihai P.
@Mike - C'est votre problème parce que vous voulez que le formulaire fonctionne (évidemment, puisque vous l'utilisez). Les machines trouvent même les sites les plus obscurs et spammeront des dizaines de milliers de soumissions par jour, rendant ces formulaires inutilisables. Donc, la prochaine fois que vous soumettez une question à une petite entreprise en utilisant un formulaire sur leur site Web et que vous devez ajouter 9 + 3 pour le faire ... et vous demander "pourquoi dois-je faire cela?" votre réponse peut être "parce que je veux en fait une réponse à ma question".
Jimbo Jonny
@JimboJonny Vous avez complètement raté mon point. Le spam est un problème (comme je l'ai dit), mais il existe des moyens de le résoudre sur le backend qui ne ternissent pas l'expérience utilisateur. J'ai actuellement des formulaires de contact déployés sur des dizaines (des centaines, même) de sites Web, et le spam est minime (quelques messages de spam par mois, par formulaire) parce que j'ai traité le spam par programmation, et non en faisant sauter les utilisateurs à travers des cerceaux. Mon point n'était pas que le spam n'est pas un problème; c'est un problème. Mon point était qu'il existe des moyens de résoudre ce problème sans tromper l'expérience de l'utilisateur.
Mike
@JimboJonny Par exemple, regardez les réponses les mieux classées (et acceptées) à cette question. Aucun n'implique aucune sorte d'entrée utilisateur. C'est ainsi que devrait être l'atténuation du spam.
Mike
0

Il y a un tutoriel à ce sujet sur le site JQuery. Bien que ce soit JQuery, l'idée est indépendante du framework.

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

bassin
la source
0

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

Matthieu
la source
0

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

vous pouvez créer un cookie sur le mouvement de la souris avec javascript ou jquery et vérifier côté serveur si le cookie existe, car seuls les humains ont la souris, le cookie ne peut être créé que par eux le cookie peut être un horodatage ou un jeton qui peut être validé

h0mayun
la source
Idée intéressante! Avez-vous utilisé cela dans le monde réel?
skybondsor
Ça ne marchera pas. De nos jours, les spammeurs utilisent un logiciel qui s'exécute dans le navigateur. Ainsi, ils peuvent imiter l'expérience utilisateur qui crée le cookie, puis l'exécuter x nombre de fois en utilisant un contenu différent généré par le logiciel.
Norbert Norbertson
Cela ne fonctionnerait pas si l'utilisateur n'utilisait pas de souris. Si votre formulaire est correctement configuré, l'utilisateur doit être en mesure de remplir l'intégralité du formulaire à l'aide de son clavier. Vous pouvez accéder aux champs suivants, utiliser la barre d'espace pour sélectionner des boutons radio et utiliser la barre d'espace (ou entrer) lorsque vous passez sur le bouton d'envoi.
Kenny Johnson
0

Utilisez 1) formulaire avec jetons 2) formulaire de vérification pour former un retard avec l'adresse IP 3) Bloquer IP (facultatif)

Vivian
la source
0

D'après mon expérience, si le formulaire n'est qu'un formulaire de «contact», vous n'avez pas besoin de mesures spéciales. Le spam est correctement filtré par les services de messagerie Web (vous pouvez suivre les demandes de formulaires Web via des scripts de serveur pour voir ce qui parvient efficacement à votre courrier électronique, bien sûr, je suppose que vous avez un bon service de messagerie Web: D)

Btw, j'essaie de ne pas compter sur les sessions pour cela (comme, compter le nombre de fois où un bouton est cliqué pour éviter les surcharges).

Je ne pense pas que ce soit une bonne chose, en effet, ce que je veux, c'est recevoir des courriels d'utilisateurs qui font une action particulière parce que ce sont les utilisateurs qui m'intéressent (par exemple, les utilisateurs qui ont consulté la page "CV" et utilisé le bon contact forme). Donc, si l'utilisateur fait quelque chose que je veux, je commence à suivre sa session et à définir un cookie (je configure toujours un cookie de session, mais lorsque je ne démarre pas une session, c'est juste un faux cookie fait croire que l'utilisateur a une session). Si l'utilisateur fait quelque chose de indésirable, je ne prends pas la peine de garder une session pour lui donc pas de surcharge, etc.

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

CoffeDeveloper
la source
0

En fait, le piège avec affichage: aucun ne fonctionne comme un charme. Cela permet de déplacer la déclaration CSS vers un fichier contenant des feuilles de style globales, ce qui obligerait les robots de spam à les charger également (une déclaration directe style = "display: none;" pourrait probablement être interprétée par un robot de spam, tout comme un déclaration de style local dans le document lui-même).

Cela, combiné à d'autres contre-mesures, devrait rendre inutile le déchargement de tout spam bots (j'ai un livre d'or sécurisé avec une variété de mesures, et jusqu'à présent, ils sont tombés dans mes pièges principaux - cependant, si un bot les contournait, là sont d'autres prêts à déclencher).

Ce que j'utilise est une combinaison de faux champs de formulaire (également décrits comme des champs non valides dans le cas où un navigateur est utilisé qui ne gère pas CSS en général ou n'affiche pas: aucun en particulier), des vérifications de cohérence (c'est-à-dire le format de l'entrée valide?), horodatage (soumissions trop rapides et trop lentes), MySQL (pour la mise en œuvre de listes noires basées sur des adresses e-mail et IP ainsi que des filtres d'inondation), DNSBL (par exemple le SBL + XBL de Spamhaus), analyse de texte ( par exemple, des mots qui sont une forte indication de spam) et des e-mails de vérification (pour déterminer si l'adresse e-mail fournie est valide ou non).

Une note sur les mails de vérification: cette étape est entièrement facultative, mais quand on choisit de la mettre en œuvre, ce processus doit être aussi simple que possible à utiliser (c'est-à-dire qu'il doit se résumer à cliquer sur un lien contenu dans l'e-mail ) et faire en sorte que l'adresse e-mail en question soit ajoutée à la liste blanche pendant un certain temps afin d'éviter les vérifications ultérieures au cas où l'utilisateur souhaiterait publier des messages supplémentaires.

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

  2. Ajoutez une vérification par e-mail. L'utilisateur reçoit un e-mail et il doit cliquer sur un lien. Sinon, supprimez le message dans un certain temps.

biscuit
la source
0

J'ai ajouté un contrôle horaire à 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

}
Harika Y
la source
0

Avec des robots anti-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 soit publié par un logiciel, un humain ou les deux, le spam est un spam en raison de son contenu. Je pense que la meilleure solution est d'exécuter le contenu publié via une API anti-spam comme Cleantalk ou Akismet. C'est relativement bon marché et efficace et ne dérange pas l'utilisateur. Vous pouvez vérifier les heures de soumission des formulaires et les autres vérifications traditionnelles pour les robots moins sophistiqués avant de frapper l'API.

nmit026
la source
Par curiosité, que pensez-vous de reCAPTCHA? Vous êtes la première à mentionner d'autres services payants, mais comment ceux-ci se comparent-ils à reCAPTCHA, et / ou pourquoi recommanderiez-vous ceux-ci sur le service gratuit?
Hawkeye
0

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

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 ensuite un "callback" après .attr () pour éviter les erreurs.

Santi Nunez
la source
-1

Juste ma valeur de cinq cents. Si le but de cela est d'arrêter 99% des robots, ce qui sonne plutôt bien, et si 99% des robots ne peuvent pas exécuter Java-script, la meilleure solution qui bat tout est simplement de ne pas utiliser un formulaire qui a une action de soumission avec une URL de publication.

Si le formulaire est contrôlé via java-script et que le java-script recueille les données du formulaire puis les envoie via une requête HTTP, aucun robot ne peut soumettre le formulaire. Étant donné que le bouton d'envoi utiliserait Java-script pour exécuter le code qui envoie le formulaire.

MartinWebb
la source