Comment empêcher les robots de remplir automatiquement un formulaire?
j'essaie de trouver un mécanisme anti-spam assez efficace pour empêcher l'entrée générée automatiquement. J'ai lu que les techniques comme captcha, 1+1=? les choses fonctionnent bien, mais ils présentent également une étape supplémentaire entravant l'utilisation rapide gratuite de l'application (Je ne cherche pas quelque chose comme ça s'il vous plaît).
j'ai essayé de mettre quelques champs cachés dans toutes mes formes, avec display: none;
Cependant, je suis certain qu'un script peut être configuré pour tracer ce champ form id et tout simplement de ne pas le remplir.
avez-vous mis en œuvre/connaissez-vous une bonne méthode anti-robots de remplissage de formulaires? Y a-t-il quelque chose qui peut être fait de façon transparente avec le traitement HTML et/ou côté serveur, et être (presque) à l'épreuve des balles? (sans JS car on pourrait tout 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).
27 réponses
une méthode facile à mettre en œuvre mais non infaillible (en particulier sur les attaques" spécifiques") de résolution anti-spam est le suivi du temps entre le formulaire-soumettre et page-charger.
Bots demande une page, d'analyser la page et de soumettre le formulaire. C'est rapide.
les humains tapent une URL, chargent la page, attendent que la page soit complètement chargée, font défiler vers le bas, lisent le contenu, décident ensemble de commenter/remplir le formulaire, prennent le temps de remplir le formulaire, et soumettre.
la différence de temps peut être subtile; et comment suivre cette heure sans cookies nécessite un certain moyen de base de données côté serveur. Cela peut avoir un impact sur le rendement.
Aussi, vous devez modifier le seuil-temps.
je trouve en fait qu'un simple champ de pots de miel fonctionne bien. La plupart des bots remplissent chaque champ de formulaire qu'ils voient, en espérant pouvoir contourner les validateurs de champ requis.
http://haacked.com/archive/2007/09/11/honeypot-captcha.aspx
si vous créez une zone de texte, le cacher dans javascript, puis vérifier que la valeur est blanc sur le serveur, cela élimine 99% des robots là-bas, et ne cause pas 99% de vos utilisateurs tout frustration du tout. Les 1% restants qui ont Javascript désactivé verront toujours la zone de texte, mais vous pouvez ajouter un message comme "laisser ce champ vide" pour ces cas (si vous vous souciez d'eux du tout).
(aussi, en notant que si vous faites style= "display:none" sur le terrain, alors c'est bien trop facile pour un robot de voir ça et de se débarrasser du terrain, c'est pourquoi je préfère le javascript approche.)
Ce qui si - le moteur de recherche ne trouve aucun form
?
3 exemples:
1. Insérez votre formulaire en utilisant AJAX
si vous êtes D'accord avec les utilisateurs ayant désactivé JS et ne pouvant pas voir/soumettre 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,
- créez un
form.html
et placez votreform
à l'intérieur d'un élément<div id="formContainer">
. - que dans 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-appât entrée
robots comme ( vraiment comme) impertinente saisie d'éléments comme:
<input
type="text"
name="email"
id="email"
placeholder="Your email"
autocomplete="nope"
tabindex="-1" />
ils seront heureux d'entrer une certaine valeur comme ils le font dsaZusil@kddGDHsj.com
que (après l'utilisation de l'HTML ci-dessus), à l'aide de 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 plus visible pour L'utilisateur, attendez-vous en PHP que votre $_POST["email"]
soit vide (sans aucune valeur)! Sinon, ne pas soumettre le formulaire.
maintenant, tout ce que oyu doit faire est de créer une autre entrée comme <input name="sender" type="text" placeholder="Your email">
après (!) le "bot-appât" d'entrée pour l'adresse Email de l'utilisateur.)
Remerciements:
développeur.Mozilla - la désactivation forme autocompletition
StackOverflow-Ignore Tabindex
ce que j'ai fait est d'utiliser un champ caché et de mettre l'horodatage dessus et ensuite de le comparer à l'horodatage sur le serveur en utilisant PHP.
S'il était plus rapide que 15 secondes (dépend de la taille de vos formulaires) qui était un bot.
Espérons que cette aide
une façon très efficace d'éliminer virtuellement le pourriel est d'avoir un champ de texte qui contient du texte tel que "supprimer ce texte afin de soumettre le formulaire!"et que le texte doit être retiré afin de soumettre le formulaire.
lors de la validation du formulaire, si le champ de texte contient le texte original, ou tout autre texte aléatoire, ne soumettez pas le formulaire. Les Bots peuvent lire les noms des formulaires et remplir automatiquement les champs Nom et E-Mail mais ne savent pas s'ils doivent réellement supprimer texte d'un certain champ afin de soumettre.
j'ai mis en œuvre cette méthode sur notre site web d'entreprise et il a totalement éliminé le spam que nous recevions sur une base quotidienne. Il fonctionne vraiment!
Que Diriez-vous de créer une zone de saisie de texte de la même couleur que l'arrière-plan qui doit rester vide. Cela permettra de contourner le problème d'un affichage de lecture bot: none
reCAPTCHA est un service gratuit anti-bots qui aide à numériser les livres
il a été acquis par Google (en 2009):
Voir Aussi
- https://en.wikipedia.org/wiki/ReCAPTCHA
- https://en.wikipedia.org/wiki/CAPTCHA pour plus d'Informations générales
beaucoup de ces spam-bots ne sont que des scripts côté serveur qui rôdent sur le web. Vous pouvez combattre beaucoup d'entre eux en utilisant 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 conduire à de nombreux problèmes (par exemple, les utilisateurs sans javascript, sur les appareils mobiles, etc), mais il 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.');
}
?>
aussi, captchas sont grands, et vraiment la meilleure défense contre le spam.
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, vérifiez le cookie.
points forts:
- pratique pour l'utilisateur et le développeur
- semble être fiable
- pas de JavaScript
Inconvénients:
- ajoute une requête HTTP
- exige que les cookies soient activés sur le client
par exemple, cette méthode est utilisée par le plugin WordPress Cookies pour Commentaires .
avec l'émergence de navigateurs sans tête (comme phantomjs) qui peuvent émuler n'importe quoi, vous ne pouvez pas supposons que:
- les robots de spam n'utilisent pas javascript,
- vous pouvez suivre les événements de la souris pour détecter bot,
- ils ne verront qu'un champ est visuellement caché,
- ils n'attendront pas un certain temps avant de soumettre.
si cela était vrai, ce n'est plus vrai.
Si vous wan est pas une solution conviviale, donnez-leur une belle , "je suis un spammeur" "1519270920 bouton" soumettre :
<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 image input[type=image]
, en changeant l'ordre après chaque chargement, les alternatives de texte, le contenu des images (et leur taille) ou le name
des 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 préférable pour les utilisateurs de screenreaders que d'être considéré comme un bot.
une façon très simple est de fournir certains champs comme <textarea style="display:none;" name="input"></textarea>
et de rejeter toutes les réponses qui ont ceci rempli.
une autre approche consiste à générer le formulaire entier (ou seulement les noms des champs) en utilisant Javascript; peu de bots peuvent l'exécuter.
de toute façon, vous ne ferez pas beaucoup contre les" bots " en direct de Taiwan ou de L'Inde, qui sont payés 0,03 $Par lien posté, et de faire leur vie de cette façon.
j'ai une approche simple pour arrêter les spammeurs qui est 100% efficace, au moins dans 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 pour les 5 dernières années une fois que j'ai mis en œuvre cette approche.
cela fonctionne en profitant des capacités D'ALIAS d'e-mail de la plupart des scripts de gestion de formulaires html (j'utilise FormMail.pl), ainsi qu'un "code" de soumission graphique, qui est facilement créés dans le plus simple des programmes graphiques. Un tel graphique inclut 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 pour le champ de formulaire est intégré dans le graphique, plutôt que figurant sur le formulaire. Ainsi, pour un robot, ce champ de forme ne présente aucun indice quant à son objet.
la seule vraie astuce ici est de s'assurer que votre html de forme 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 pseudonyme d'e-mail, qui pointe vers n'importe quelle adresse e-mail que vous voulez utiliser. Comme il n'y a pas d'invite de quelque nature que ce soit sur le formulaire pour qu'un robot puisse lire et aucune adresse e-mail, il n'a aucune idée de ce qu'il faut mettre dans le champ de formulaire vide. S'il ne met rien dans le champ de forme ou quoi que ce soit à l'exception des codes acceptables, la présentation du formulaire échoue avec une erreur de "mauvais destinataire". Vous pouvez utiliser un graphique différent sur différentes formes, 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 similaires, plus élégants, schémas. Si un spammer humain répond à l'échec du destinataire et programme le code image dans le robot, vous pouvez le changer facilement, une fois que vous réalisez que le robot a été dur-codé pour répondre. En cinq ans d'utilisation de cette approche, je n'ai jamais eu de spam à partir de l'un des formulaires sur que je l'utilise et je n'ai jamais eu une plainte de la part des utilisateurs humains des formes. Je suis certain que cela pourrait être battu avec la capacité OCR dans le robot, mais je n'ai jamais eu cela se produire sur aucun de mes sites qui utilisent des formes html. J'ai également utilisé des "spam traps" (code html caché "come hither" qui pointe vers mes politiques anti-spam) à bon effet, mais ils étaient seulement efficace à 90%.
je pense à beaucoup de choses ici:
- en utilisant JS (bien que vous ne le vouliez pas) pour suivre le déplacement de la souris, appuyez sur la touche, cliquez sur
- obtenir l'url de référence (qui dans ce cas devrait être un du même domaine) ... l'utilisateur normal doit naviguer sur le site avant d'atteindre le formulaire de contact: PHP: comment obtenir L'URL de referrer?
- utilisant une variable $_SESSION pour acquérir la PI et vérifier le formulaire soumettre contre cette liste D'IPs
- remplissez un champ de texte avec du texte fictif que vous pouvez vérifier du côté du serveur s'il a été écrasé
- vérifier la version du navigateur: http://chrisschuld.com/projects/browser-php-detecting-a-users-browser-from-php.html ... Il est clair qu'un bot n'utilise pas un navigateur mais juste un script.
- utilisez AJAX pour envoyer les champs un par un et vérifier la différence dans le temps entre les observations
- utilisez une fausse page avant/ après le formulaire, juste pour envoyer une autre entrée
une autre option au lieu de faire des lettres et des nombres aléatoires comme le font de nombreux sites web, est de faire des images aléatoires d'objets reconnaissables. Demandez ensuite à l'utilisateur de taper soit quelle couleur est quelque chose dans l'image, ou ce que l'objet lui-même est.
en somme, chaque solution aura ses avantages et ses inconvénients. Vous allez devoir trouver une médiane heureuse entre trop difficile pour les utilisateurs de passer le mécanisme antispam et le nombre de robots spam qui peuvent passer à travers.
la meilleure solution que j'ai trouvé pour éviter d'être débordé par les bots est d'utiliser une question ou un champ très trivial sur votre formulaire.
Essayez d'ajouter un champ comme celui-ci :
- Copie "bonjour" dans la boîte de côté
- 1+1 = ?
- Copiez le nom du site Web dans la case
ces astuces demandent à l'utilisateur de comprendre ce qui doit être entré sur le formulaire, ce qui rend beaucoup plus difficile pour être la cible de remplissage de bot massive.
MODIFIER
à L'arrière de cette méthode, comme vous l'avez indiqué dans votre question, c'est l'étape supplémentaire pour l'utilisateur de valider son formulaire. Mais, à mon avis, il est beaucoup plus simple qu'un captcha et le overhead lors du remplissage du formulaire n'est pas plus de 5 secondes, ce qui semble acceptable du point de vue de l'utilisateur.
la manière simple que j'ai trouvé pour faire ceci est de mettre un champ avec une valeur et demander à l'utilisateur de supprimer le texte dans ce champ. les robots ne font que les remplir. si le champ n'est pas vide, cela signifie que l'utilisateur n'est pas humain et il ne sera pas affiché. c'est le même but d'un code captcha.
c'est juste une idée, id utilisé que dans mon application et fonctionne bien
vous pouvez créer un cookie sur le mouvement de la souris avec javascript ou jquery et dans la vérification côté serveur si le cookie existe, parce que seuls les humains ont la souris, le cookie peut être créé seulement par eux le cookie peut être un timestamp ou un token qui peut être validé
Use 1) formulaire avec des jetons 2) Vérifier la forme à la forme retard avec adresse IP 3) Bloc IP (facultatif)
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. Spam obtenir décemment filtré par les services de courriel Web (vous pouvez suivre les demandes de formulaire Web via des scripts de serveur pour voir ce qui atteignent effectivement votre courriel, bien sûr je suppose que vous avez un bon service de courriel Web: d)
Btw j'essaie de ne pas compter sur les sessions pour cela (comme, compter comment plusieurs fois un bouton est cliqué pour prévenir les surcharges).
Je ne pense pas que ce soit bon, en effet ce que je veux réaliser est de recevoir des e-mails des utilisateurs qui font une action particulière parce que ce sont les utilisateurs qui m'intéressent (par exemple, les utilisateurs qui ont regardé la page" CV " et utilisé le bon formulaire de contact). Donc si l'utilisateur fait quelque chose que je veux, je commence à suivre sa session et à configurer un cookie (j'ai toujours configuré le cookie de session, mais quand je ne démarre pas une session c'est juste un faux cookie fait pour croire que l'Utilisateur a une session). Si l'utilisateur fait quelque chose indésirable Je ne prends pas la peine de garder une session pour lui donc pas de surcharge, etc.
aussi, il serait agréable pour moi que les services de publicité offrent une sorte d'api(peut-être que cela existe déjà) pour voir si l'utilisateur" regardé l'annonce", il est probable que les utilisateurs regardant des annonces sont de véritables utilisateurs, mais si elles ne sont pas vraiment bien au moins vous obtenez 1 Vue de toute façon donc rien de perte. (et croyez-moi, les annonces, les contrôles sont plus sophistiqués que ce que vous pouvez faire seul)
en fait le piège avec affichage: Aucun fonctionne comme un charme. Il est utile de déplacer la déclaration CSS vers un fichier contenant des feuilles de style globales, ce qui forcerait les robots spam à les charger eux aussi (une déclaration directe style="display:none;" pourrait probablement être interprétée par un bot spam, tout comme une déclaration de style local dans le document lui-même).
ceci combiné avec d'autres contre-mesures devrait le rendre sans objet pour tous les robots de spam pour décharger leurs déchets (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 primaires - cependant, si un bot les contourner, Il ya d'autres prêts à déclencher).
ce que j'utilise est une combinaison de faux champs de formulaire (également décrit comme des champs invalides dans le cas où un navigateur est utilisé qui ne gère pas CSS en général ou affichage: Aucun en particulier), des contrôles de santé (I. E. est le format de l'entrée est-il valide?), horodatage (soumissions trop rapides et trop lentes), MySQL (pour la mise en œuvre des listes noires basées sur les adresses e-mail et IP ainsi que sur les filtres d'inondation), DN-BLS (E. G. the SBL+XBL from Spamhaus), text analysis( E. G. mots qui sont une indication forte pour le spam) et e-mails de vérification (pour déterminer si l'adresse e-mail fournie est valide ou non).
une note sur les courriers de vérification: cette étape est entièrement facultative, mais quand on choisit de l'implémenter, cette processus doit être aussi facile à l'utilisation que possible (c'est-à-dire, il doit se limiter à cliquer sur un lien contenu dans l'e-mail) et de faire l'adresse e-mail en question d'être whitelisted pour une certaine période de temps afin que les vérifications ultérieures sont évitées au cas où l'utilisateur veut faire des messages supplémentaires.
-
j'utilise une méthode où il y a une boîte de texte cachée. Depuis que les bots parcourent le site ils le remplissent probablement. Puis je vérifie si elle est vide si elle n'est pas des retours de site web.
-
ajouter vérification par courriel. L'utilisateur reçoit un e-mail et doit cliquer sur un lien. Autrement jeter le post dans un certain temps.
j'ai ajouté une vérification de l'heure à mes formulaires. Les formulaires ne seront pas soumis s'ils sont remplis en moins de 3 secondes et cela a bien fonctionné pour moi surtout pour les formulaires longs. Voici la fonction de vérification de formulaire que j'appelle sur le bouton Soumettre
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
}
vous pouvez essayer de tricher spam-robots ajoutant l'action correcte atribute après validation Javascript. donc si le robot bloque javascript ils ne soumettent 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
avec des robots de spam de plus en plus sophistiqués et des techniques comme les navigateurs automatisés, il deviendra plus difficile de déterminer la source du spam. Mais que ce soit publié par un logiciel, un humain, ou les deux, le spam est le spam en raison de son contenu. Je pense que la meilleure solution est d'exécuter le contenu posté à travers une API anti-spam comme Cleantalk ou Akismet. Il est relativement bon marché et efficace et ne tracasse pas l'utilisateur. Vous pouvez vérifier les délais de soumission des formulaires et les autres contrôles traditionnels pour moins bots sophistiqués avant de frapper L'API.
les Robots ne peuvent pas exécuter JavaScript donc vous faites quelque chose comme l'injection d'une sorte d'élément caché dans la page avec JavaScript, puis la détection de sa présence avant la soumission du formulaire, mais attention car certains de vos utilisateurs auront aussi Javascript désactivé
sinon je pense que vous serez forcé d'utiliser une forme de client preuve de "l'humanité "
juste mes cinq cents. Si le but 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 soumettre avec une URL de post.
si le formulaire est contrôlé via java-script et que java-script collecte les données du formulaire et les envoie ensuite via une demande HTTP, aucun robot ne peut soumettre le formulaire. Puisque le bouton Soumettre utiliserait Java-script pour lancer le code qui envoie le formulaire.