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).
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.
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).
Et si - le Bot ne trouve aucune form
du tout?
3 exemples:
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,
form.html
et placez votre form
dans un élément <div id="formContainer">
. <div id="dynamicForm"></div>
vide et ce jQuery:$("#dynamicForm").load("form.html #formContainer");
// 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>
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
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
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!
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
reCAPTCHA est un service gratuit antibot qui aide à numériser des livres
Il a été acquis par Google (en 2009):
Regarde aussi
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.
Je suis surpris que personne n'ait encore mentionné cette méthode:
Avantages:
Les inconvénients:
Par exemple, cette méthode est utilisée par le plugin WordPress Cookies for Comments .
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.
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.
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%.
Je pense à beaucoup de choses ici:
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
}
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.
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.
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.
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.
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.
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é
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.
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.
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.
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)
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:
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.
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)
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