Vous n'êtes pas identifié.
Pages: 1
Réponses : 12 / Vues : 8 293
Dans ce tutoriel, nous allons voir ainsi qu'aborder les différentes formes de systèmes anti-bot pour pouvoir vous protéger du spamming de masse sur votre site.
Nous verrons les systèmes captcha en passant par les champs cachés, la détection du postage de commentaires en masse, jusqu'aux "captchas" textuels simples mais qui peuvent être sécurisés.
Il faut savoir que nous aborderons surtout une partie théorique. Il n'y aura pas -ou très peu- d'exemples de code.
Je vous invite à cliquer sur le lien ci-dessous pour lire la suite.
Allez, on commence ?
1. Le captcha
2. Les questions logiques
3. Les Questions culturelles & autres
4. Un anti-bot spécial : le système de suppression
5. Le champ caché
6. Avantages et inconvénients
7. Bonus
1. Le captcha
Qu'est ce qu'un captcha?
C'est la forme la plus simple et la moins embêtante pour se protéger des attaques de spamming.
En effet, il permet de filtrer une assez grande partie des robots venant sur un site. Deux formes de captchas se présentent :
Le captcha simple, le traditionnel quoi
Le captcha a formule mathématique
Le captcha simple est celui que vous connaissez tous : il consiste en une image déformée, bruitée, rayée, de différente couleur avec dedans un texte alphanumérique. L'utilisateur doit ensuite recopier cette image dans un formulaire. Si l'image a bien été recopiée, alors, le message est posté.
Ce captcha présente quelques contraintes : il peut présenter des difficultés pour les mal-voyants/aveugles du fait de sa difficulté de lecture.
Nous avons ensuite le captcha mathématique qui consiste en une formule mathématique ("5 + 7", "cinq + 7", "cinq plus sept", "combien font 5 + 7", etc...) que l'utilisateur doit résoudre. Ces captchas peuvent se présenter comme soi disant difficiles pour le robot. Il n'en n'est rien. En effet, on peut "éduquer" le robot à lire cette image et donc la résoudre.
Quelles sont les contraintes ainsi que les atouts des captchas ?
Comme dit plus haut, le principal point négatif peut-être la difficulté de lecture dans certain cas pour les gens "normaux" ainsi que la quasi-impossibilité pour les mal-voyants.
Ce type de catpcha peut aussi, s'il est mal fait, être totalement inefficace : si la police d'écriture est toujours la même, le bot peut l'apprendre puis, reconnaître les motifs présentés par l'image.
Je m'explique. Imaginons que l'image présente des nombres numériques (de 0 à 9) rayés aléatoirement. Le méchant pirate n'a qu'à enregistrer quelques images sur son disque dur, il prend ensuite les 10 nombres puis les enregistre au bot. Le bot n'a ensuite qu'a érosionner l'image pour ensuite pouvoir reconnaître facilement les caractères.
Mais alors, qu'est-ce qu'il faut faire ?
Il faudrait utiliser un captcha dans lequel différentes polices sont utilisées (disons 3 ou 4) et choisies aléatoirement pour chaque caractère. Il faut aussi que la taille de chaque caractère soit différente ainsi que les caractères soient disposés à une hauteur différente les uns des autres. Vous pouvez ensuite incliner l'image/les caractères (comme le fait Google et Wikipédia par exemple) pour qu'ils soient plus difficiles à reconnaître par un robot. Mais attention : cela doit toujours continuer à être lisible par un être humain. Sinon, des visiteurs vont filer entre vos mains.
Si vous voulez toujours rester sur un captcha mathématique, ce que je vous déconseille, vous pouvez faire alterner vos nombres "numériques" en nombres "écrits" alphabétiquement. Vous pouvez aussi ajouter des "Combien font " au début ou des "x+y, telle est l'équation" à la fin du captcha pour essayer de tromper le robot.
2. Les questions logiques
Nous allons maintenant parler des questions logiques.
C'est quoi les questions logiques ?
Pour moi, une question logique est une question ayant comme source un texte brut. Petit exemple très célèbre: "Quelle est la couleur du cheval blanc d'Henri IV?". C'est questions ont une particularité d'être logiques, et donc d'être impossibles à résoudre par un bot con.
Comment faire un bon groupe de questions logiques ?
Pour pouvoir semer les bots lors de leurs postages de commentaires, voici les conseils que je vous propose :
Vous devez avoir un important groupe de questions (entre 10 et 15) qui comportent différentes variables qui peuvent changer.
Par exemple, nous aurions pour la question précédente les variantes suivantes possibles :
Quelle est la couleur du cheval {blanc/rouge/noir/marron/bleu/violet/fluo/jaune} d'Henri IV?
Quelle est la couleur du {cheval/chat/chien/mouton/putois (plus d'idées)} blanc d'Henri IV?
Quelle est la couleur du cheval blanc de {Henri IV/Marcel Ier/Chirac/Sarkozy/Louis XIV}?
Vous voyez qu'il y a déjà pas mal de possibilités.
Nous aurions donc en total, si on les combine, ces possibilités là :
Quelle est la couleur du {cheval/chat/chien/mouton/putois} {blanc/rouge/noir/marron/bleu/violet/fluo/jaune} de {Henri IV/Marcel Ier/Chirac/Sarkozy/Louis XIV} ?
Ce qui fait en total 200 possibilités pour le bot de se tromper si il mémorise la question.
Si vous ajoutez ensuite 10 questions avec leurs variantes, vous pouvez désorienter totalement le bot. Bien sur, pour renforcer encore la sécurité, vous pourriez, pour chaque question, inverser des mots. Par exemple, la question vue plus haut deviendrait :
"Blanc est la couleur du cheval d'Henri IV. Quelle est sa couleur".
Voici un petit exemple que vous pouvez faire en PHP :
<?php
$animal = array('cheval','chat','chien','mouton','putois');
$couleur = array('blanc','bleu','rouge','noir','violet','jaune');
$personne = array('Henri IV','Marcel 1er','Chirac','Sarkozy');
$couleurFinale = $couleur[rand(0,5)];
$phrase = 'Quelle est la couleur du '.$animal[rand(0,4)].' '.$couleurFinale.' de '.$personne[rand(0,3)].' ?';
//Ensuite, au traitement,
if($couleurFinale = = $couleurUtilisateur){ //J'ai mis un espace entre les deux = car sinon, ca fait bugger le "bbcode"
postCommentaire($commentaire);
echo 'Merci d\'avoir posté un commentaire';
}
else
echo 'Votre code anti bot est faux';
?>
Quelques exemples:
Combien de temps a duré la guerre de cent ans ?
En quel mois les Français fêtent-ils la révolution de Juillet ?
Quel est le nom du président Sarkozy ?
Quelle est la couleur extérieure d'une boite jaune ?
Combien de secondes y a t'il en une seconde ?
etc...
Voila, vous savez tout sur le système des questions logiques. Normalement, le système doit bien marcher. A une condition : il faut qu'il y ait plusieurs réponses choisies aléatoirement et que les réponses ne contiennent pas de piège. Comme par exemple pour la première question que je vous ai donné en exemple, il faudrait l'éviter (en tous cas pour 100 ans). En effet, certains répondraient 116.
3. Les Questions culturelles & autres
Dans le même registre que les questions logiques, nous pouvons utiliser les questions culturelles.
Qu'est ce que sont les questions culturelles ?
Elles mettent en jeu la culture générale de l'auteur ainsi que facultativement, sa capacité de calcul (non non, pas besoin de 20GFlops pour ces questions ). Je m'explique : le site pose une question, mettant en jeu la culture de l'utilisateur, sélectionnée aléatoirement par une liste établie par le webmaster. Cette question devra prendre en compte deux paramètres dont un qui devrait être variable.
Quelques exemples?
Ajoutez deux à la date de la fin de la seconde guerre mondiale.
{Ajoutez/Soustrayez} {un/deux/trois/(je vous conseille pas de mettre 19542.5)} à la date {du début/de la fin} de la {premiere/seconde} guerre mondiale.
Quelle sécurité ?
Vous voyez déjà que pour un bot con, il lui sera impossible (à part si c'est une intelligence artificielle bien sur) de passer à travers cette protection. Par contre, si quelqu'un veut vraiment vaincre ce piège, cette sécurité est cassable. Pour cela, il faudrait disposer d'une, comme l'autre, petite base de données de questions avec diverses variantes.
Petit exemple en PHP
Voici un petit exemple en PHP pour vous montrer un peu comment faire :
<?php
$ajSu = array('Ajoutez','Soustrayez'); //Pour ajouter ou supprimer
$nombres = array('un', 'deux', 'trois'); //Les nombres
$debFin = array('du début', 'de la fin'); //Début ou fin
$dates = array(array('1914','1918','1939','1945'), array('premiere', 'premiere', 'seconde', 'seconde')); //Les guerres
$rajSu = rand(0,1);
$rnombres = rand(0,2);
$rdebFin = rand(0,1);
$rdates = rand(0,1);
echo $ajSu[$rajSu] .' '. $nombres[$rnombres] .' à la date '. $debFin[$rdebFin] .' de la '. $dates[1][$rdates*2] .' guerre mondiale';
//On echo la question
$aTrouver = $rnombres + 1;
if($rajSu = = 0){
$aTrouver = $aTrouver + $dates[0][$rdates*2+$rdebFin] ;
}
else
$aTrouver = $dates[0][$rdates*2+$rdebFin] - $aTrouver;
////////// AU TRAITEMENT:
// $aTrouver est transmis par session
if($_POST['antibot'] == $aTrouver)
postCommentaire($commentaire);
else
echo 'Le code est faux';
?>
Comment ajouter des dates ?
Vous devez tout simplement ajouter les dates dans le array (date de début + nom, date de fin + nom) et ajuster les rands pour qu'ils piochent dans l'array. Bien sur, vous pouvez faire tout ca par BDD qui est beaucoup plus puissant est beaucoup plus simple à manager.
Quelques petits exemples
Première guerre mondiale
Seconde guerre mondiale
Attentats du 11
Naissance du SDZ Nan, je crois pas
Jour actuel
Mois actuel
Année actuelle
Siècle de la naissance de Jésus
4. Un anti-bot spécial : le système de suppression
Il m'est arrivé quelques fois sur mon blog tournant sur dotclear 1 (je ne pouvais pas mettre de système anti-spam, c'était trop mal codé/complet) des attaques massives de bots.
Comment ça des attaques massives ?
Quand je parle d'attaques massives, c'est du style vous vous payez en pleine poire 1000 commentaires en moins d'une heure. Super. Bon, la suppression, ça va: je supprime tout commentaire qui ont un id supérieur au dernier commentaire "sain". Sauf que c'est... pas automatique. Parfois, ce sont plusieurs IP (environ 10 ou 15, utilisant probablement les proxy) qui postent en même temps. C'est donc un peu dur de faire une suppression avec un WHERE 'comment_ip' = '22.22.22.22'. J'ai donc pensé à un système qui est assez efficace et qui fait la majorité du travail à votre place.
Comment ça fonctionne ?
Voilà en quoi consiste le système : à chaque fois qu'un commentaire est posté, il vérifie tous les commentaires postés avec une même IP dans une plage de 24H. Si le nombre de commentaires est supérieur à 5, il n'envoie pas le commentaire, supprime les autres et met l'IP du suspect dans une grey list. Ensuite, le posteur est averti sur la fenêtre de post lui disant de ne plus poster de commentaire pour aujourd'hui (il faut être gentil : mettez par exemple que vous avez un problème avec le serveur. Sinon, il va se vexer). Si l'utilisateur continue à poster un autre commentaire, le script met l'IP dans une black list. Il ne peut plus {envoyer de commentaire/accéder au site}. Libre à vous de choisir.
Ensuite, mensuellement, vous activez un script qui vide les tables grey/black list et qui supprime les IPs des commentaires plus vieux que 2 semaines (ben ouais, ça remplit les tables les IPs. Et puis 2 semaines si vous voyez un commentaire illégal, vous avez le temps de voir l'IP).
Et voila, vous avez votre super système anti-bots qui marche bien s'il est bien configuré. Ca vous évitera les "vagues de botoposteurs".
Variante : les statistiques des mots
Une autre variante : à chaque commentaire posté, vous mettez dans une table les mots ainsi que les URLs puis vous les supprimez si le pourcentage d'un mot est trop grand.
Je m'explique : chaque fois qu'une personne poste un commentaire, son message est découpé. Chaque mot est séparé par un espace.
Vous aurez donc pour le message suivant : "Salut! Moi et deux moi ca fait trois moi" (totalement con, je sais), le tableau de mots suivant :
Code : Autre
!-----!
! Mot ! % !
!-----!
!salut!11%!
!moi !33%!
!et !11%!
!deux !11%!
!ca !11%!
!fait !11%!
!trois!11%!
!-!---!
Vous aurez donc des mots avec des pourcentages différents. Maintenant, le truc consiste à chercher des mots dans le tableau et voir s'ils y sont dans la table black list. Ensuite, si ces mots ("connard", "viagra", etc...) on un pourcentage élevé (+30%), on supprime le message. Je vous conseille aussi d'utiliser cette technique pour les URLs (commençant par "http://"). En effet, certains bots postent des longs messages composés d'URLs pour pageranker leurs sites web ou peut-être pour descendre le page rank du site visé. Je ne sais pas exactement. Cette méthode est assez puissante car la plupart des robots postent des messages de ce style.
5. Le champ caché
Une autre technique qui peut bien marcher, c'est la technique du champ caché mais pas si caché pour certains.
La technique consiste à mettre, dans le formulaire, un champ anodin appelé 'website', 'site' ou 'url'. Vous devez ensuite dans le fichier css, modifier la définition de ce champs pour mettre un 'display:none;'.
Le robot tout con qui va regarder le code de la page va voir son champ website. Tout content, il va le remplir avec son site puis va poster le commentaire.
Vous, qui êtes si malins , au traitement, vous faites un joli :
Code PHP :
<?php
if($_POST['website'] != "")
die('Connard de bot!');
else
postCommentaire($commentaire);
?>
La vulgarité vient du fait que je suis énervé contre les bots spammeurs.
Voilà. Si le bot remplit la page, ça ne marche pas. Au contraire, si c'est un visiteur qui a un navigateur assez récent qui peut afficher le css, il ne verra pas le champ. Il pourra donc poster son commentaire.
6. Avantages et inconvénients
Le captcha
Voici les principaux avantages du captcha:
Très puissant si bien réalisé
Stylé
Puis les inconvénients:
Non accessible
Peut être difficile à lire
Si mal fait, presque inutile
Les questions logiques
Voici les avantages des questions logiques:
Simple pour les visiteurs
Accessible aux mal-voyants
Original
Ainsi que leurs inconvénients
Le visiteur peut prendre la question au sérieux => Guerre de cent ans -> 116 ans
Si quelqu'un veut vraiment vous faire chi3r, peut être craquable
Impossible à résoudre pour les étrangers (sites multilingues)
Les questions culturelles
Avantages:
Simple pour les visiteurs
Accessible aux mal-voyants
Original
Inconvénients:
Tout repose sur la culture générale. Inadapté pour les sites accueillant des petits
Si quelqu'un veut vraiment vous faire chi3r, peut être craquable
Impossible à résoudre pour les étrangers (sites multilingues)
Suppression des commentaires
Voici les avantages de ce système:
Pratique pour les "grands posteurs"
Invisible pour l'utilisateur
Ainsi que ses inconvénients:
Si le bot utilise une grande liste de proxys, inefficace
Si le bot poste juste 4 commentaire par ip/jour, inefficace
Suppression par mots clefs
Inconvénients (ouais, ca me faisait chi3r de toujours commencer par les avantages ):
SI le gars veut vous emm3rder sur votre site, ben il a qu'a mettre: "Salut!"
Toujours la question du site multilingue
Peut consommer pas mal de ressources
Puis les avantages:
Puissant pour les bots "automatiques"
Filtre une grande partie des spams
Inefficace contre les messages à caractère aléatoire (xvaohdss)
Le champ caché
Avantages:
Très puissant contre les bots passagers qui remplissent tous les champs qu'ils trouvent
Inconvénients:
Si quelqu'un veut vraiment poster des commentaires/spams sur votre site, ben c'est inefficace
Quel système faut-il donc prendre ?
Personnellement, je vous conseillerais de combiner le système du champ caché et du captcha imagé pour protéger votre site. Après, cela dépend si votre site veut etre portable : il faudra donc plutot choisir un choix entre le champ caché et les questions textuelles plus peut-être (si vous avez du temps à perdre ) un système de détection de plus de x posts par y minutes.
7. Bonus
Je voudrais vous faire part d'une petite chose toute bête mais qui peut vous embêter:
Lors de vos captchas, il peut vous arriver de faire cela:
commentaires.php
Code PHP :
//On génere le captcha :
$captcha = '5574';
//On affiche le captcha:
echo $captcha;
//On transmet le captcha:
$_SESSION['captcha'] = $captcha;
post_commentaire.php
Code PHP :
$captcha = $_POST['captcha'];
$commentaire = $_POST['commentaire'];
if($captcha = = $_SESSION['captcha'] AND $_SESSION['captcha'] != ''){
postComment($commentaire);
echo 'Votre commentaire a bien été posté'
}
else
echo 'Erreur dans le captcha';
Dans ce script, la grande erreur est de ne pas détruire la session contenant le captcha à la fin de l'exécution du script. En effet, si je veux poster beaucoup de commentaires sur votre site, je n'ai qu'à remplir le captcha et au traitement, cliquer 50 fois sur F5 : j'aurais envoyé 51 commentaires. Or, si vous supprimez la variable contenant le captcha, vous ne pourrez pas envoyer plus d'une fois votre captcha et vous devrez donc le revalider à chaque fois.
Voilà, maintenant, vous savez presque tout (ben ouais, on peut rien connaître parfaitement ) sur les différents moyens de protéger votre site des attaques de spamming. Ce tutoriel peut peut-être vous paraître un peu paranoïaque, je vous l'accorde. Mais c'est en étant sur-sécurisé qu'on peut contrer les failles.
Vous pouvez toujours me laisser un petit commentaire en me disant ce que je pourrais améliorer ou modifier.
Philippe
Excellent Tuto j'irais demandé cela a Franck
http://frank.villaro-dixon.eu/article-7 … -site.html
sinon pas mal !
Tu pourras lui dire que j'ai corrigé pas mal de choses, c'était pas top top ...
Philippe
Loic a écrit :
Tu pourras lui dire que j'ai corrigé pas mal de choses, c'était pas top top ...
On s'en fout des fautes !! c'est le fond qui est bon
Philippe a écrit :
Loic a écrit :
Tu pourras lui dire que j'ai corrigé pas mal de choses, c'était pas top top ...
On s'en fout des fautes !! c'est le fond qui est bon
Il n'y a pas que les fautes, le code est optimisé aussi.
Alex31
Oui c'est bien repris et optimisé.
Krys aime votre commentaire (FesseBook)
Pour TST j'ai utilisé 3 techniques de blocage supplémentaires à FluxBB d'origine :
- Le calcul
- Les sessions
- 2 champs masqués qui doivent rester vierge (website et url)
Bien vu Krys pour m'avoir relancé sur ça.
Alex31
Oui il fallait agir, pour les voir mourir !
Il fallait osé, pour ne plus les voir abusé
Il fallait faire quelque chose, pour les voir trouver porte close
krys31 a écrit :
Oui il fallait agir, pour les voir mourir !
Il fallait osé, pour ne plus les voir abusé
Il fallait faire quelque chose, pour les voir trouver porte close
Ca y est, il a recommencé à fumer la moquette ...
Alex31
Pas la moquette, ça fait un an que je l'ai fini, non plutôt la chaussette
Alex31
Dis moi Loic, t'as pas la version html de :
???
Ceci est du PHP, c'est une condition, donc le HTML n'est pas applicable dans ce cas.
Alex31
D'ou ma demande du html, mais c'est ok.
Voila ce que j'ai fait...
Pour le paragraphe 5 :
Dans le formulaire (form) on y met :
Et dans la page php formulaire ou monformulaire.php , on y met dedans :
Je ne donne pas le superbe script final d'un formulaire d'envois qui marche même chez free et pour cause : on doit se tracasser les méninges et de plus on peut le mettre dans un livre d'or, système de commentaires, chatbox...
Réponses : 12 / Vues : 8 293
Pages: 1