web-dev-qa-db-fra.com

Empêcher les robots malveillants d'envoyer du spam

Je me souviens n site fermé à cause d'une mauvaise utilisation et je me demande si les bots en ont une partie. Si le bot publie quelque chose sur mon site, comment puis-je le combattre? Je pensais installer des cookies et faire changer les cookies via JavaScript + horodatage et signature (les cookies d'hier ne peuvent donc pas être utilisés aujourd'hui et la semaine prochaine).

Je suis sûr que la plupart des personnes/bots utiliseraient simplement un autre site au lieu d'activer JavaScript dans leur bot.

Que puis-je faire d'autre? Je pense au quotidien POST limit et à un pot de miel pour les robots génériques qui postent au hasard du spam.

15
user1585

Vous pouvez faire plusieurs choses, notamment:

  1. Mettre un faux terrain que seuls les bots verront. Ensuite, si ce champ est soumis avec le reste du formulaire, vous pouvez l'ignorer (et les interdire si vous le souhaitez). Vous pouvez aussi piéger les mauvais robots qui suivent un lien caché .

  2. Utilisez un CAPTCHA comme reCAPTCHA

  3. Utilisez un champ qui oblige l'utilisateur à répondre à une question du type 5 + 3. Tout être humain peut y répondre, mais un bot ne sait pas quoi faire, car il s'agit de champs à remplissage automatique basés sur des noms de champ. Ce champ sera donc incorrect ou manquant, auquel cas la soumission sera rejetée.

  4. Utilisez un jeton et insérez-le dans une session. Ajoutez-le également au formulaire. Si le jeton n'est pas soumis avec le formulaire ou ne correspond pas, il est automatisé et peut être ignoré.

  5. Recherchez les soumissions répétées de la même adresse IP. Si votre formulaire ne doit pas recevoir trop de demandes mais qu'il est soudainement frappé par un bot, vous devez envisager de bloquer temporairement l'adresse IP.

  6. Utilisez Askimet . C'est excellent pour identifier le spam.

13
John Conde

John Conde décrit beaucoup de bonnes approches. Le problème avec le choix d’une technique anti-bot/anti-spam réside dans l’équilibre entre efficacité et commodité. Il serait très gênant de devoir remplir un CAPTCHA chaque fois que vous souhaitez publier un commentaire ou un message, mais si vous n’avez besoin que d’un CAPTCHA lors de votre inscription, cela ne dissuadera parfois pas les spammeurs.

Certaines des techniques passives sont une bonne alternative, car elles ne nécessitent aucune action humaine. Le problème est que les bots deviennent de plus en plus sophistiqués, et si les bots peuvent résoudre les CAPTCHAs, alors ils peuvent certainement traiter JS et CSS. Vous devrez donc faire preuve d'un peu d'ingéniosité, par exemple utiliser un code CSS moins évident pour masquer vos champs de pièges à robots.

Mais sur la base de votre question, je pense que vous réalisez probablement que l’important n’est pas de créer un site anti-bot, mais juste de créer suffisamment de force de dissuasion pour que les utilisateurs de bot choisissent simplement d’autres cibles plus faciles. Donc, ce qui est requis ici variera d’un site à l’autre et nécessitera probablement des essais et des tests d’erreur. Je voudrais d'abord essayer les techniques les moins importunes.

Enfin, une autre façon de supprimer le courrier indésirable de votre site consiste à utiliser la modération par les pairs pour supprimer tout commentaire soumis par un bot ou tout spam envoyé manuellement.

6
Lèse majesté

Comme John Conde l’a mentionné dans son # 1) et vous-même, le pot de miel peut très bien fonctionner dans la plupart des cas et sur la plupart des sites Web. Si un robot le fait déjà, vous pouvez également utiliser l'une des méthodes décrites par John. Mais honnêtement, si votre site est à trafic faible ou moyen, cela devrait faire l'affaire.

Exemple, un de mes favoris:

<form action="/process-form">
<input name="email" placeholder="Enter Your Email">
<input name="email_address" placeholder="Enter Your Email" style="display:none;">
<input type="submit" value="Submit"></form>

Désormais, lorsque le formulaire est soumis, un pourcentage extrêmement élevé de robots remplit à la fois "email" et "email_address", mais les humains ne renseignent que celui qu'ils voient, "email" et non "email_address". Donc, dans votre code `/ process-form ', il vous suffit de vérifier si email_address est (non) vide pour vérification.

Simple et efficace.

1