Améliorer le captcha des commentaires pour plus de sécurité (Spam)
Mordred
Member
Bonjour !
Par défaut, Pluxml utilise un captcha au format texte.
J'ai eu la désagréable surprise de trouver quelques spams rapidement supprimés en commentaire.
Il est possible d'empêcher la grande majorité des spams en utilisant un captcha image un peu plus évolué.
Nous allons tout d'abord créer un script générant une image contenant un code aléatoire, que nous comparerons ensuite, afin de s'assurer que c'est bien un humain, et non un bot, qui souhaite ajouter un commentaire.
Créez un fichier appelé captcha.php, à la base de votre dossier Pluxml, dans ce même dossier, créez un dossier appelé "fonts", puis placez les 3 polices d'affichages utilisées pour afficher le captcha dans ce dossier :
Police 1 : 1.ttf
Police 2 : 2.ttf
Police 3 : 3.ttf
Voici le contenu à mettre dans captcha.php :
Nous allons ensuite remplacer le captcha texte par notre image.
Avec votre client FTP favoris, récupérez le fichier articles.php situé dans /themes/nom_de_votre_theme/articles.php
Modifiez ensuite les lignes suivantes :
La dernière étape consiste tout simplement à vérifier que le code entré par l'utilisateur (Ou le bot !) est valide. Si il est valide, alors le commentaire est posté, sinon, il ne l'est pas.
Récupérez le fichier class.plx.motor.php situé dans /core/lib/.
Modifiez ensuite les lignes suivantes (Ligne 755 dans la version actuelle) :
Et puis voilà ! A mort le spam !
(J'ai copié-collé cet article de mon blog, l'article est ici, ça présente mieux !)
Par défaut, Pluxml utilise un captcha au format texte.
J'ai eu la désagréable surprise de trouver quelques spams rapidement supprimés en commentaire.
Il est possible d'empêcher la grande majorité des spams en utilisant un captcha image un peu plus évolué.
Nous allons tout d'abord créer un script générant une image contenant un code aléatoire, que nous comparerons ensuite, afin de s'assurer que c'est bien un humain, et non un bot, qui souhaite ajouter un commentaire.
Créez un fichier appelé captcha.php, à la base de votre dossier Pluxml, dans ce même dossier, créez un dossier appelé "fonts", puis placez les 3 polices d'affichages utilisées pour afficher le captcha dans ce dossier :
Police 1 : 1.ttf
Police 2 : 2.ttf
Police 3 : 3.ttf
Voici le contenu à mettre dans captcha.php :
<?php
session_start();
mt_rand(); // On initialise la fonction mt_rand
header("Content-type: image/png"); // Génère un header au format d'image PNG
// $letter contient la liste des lettres pouvant être générées
$letter = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
// Puis enfin nous générons le code aléatoire
$code = $letter[mt_rand(0,25)].mt_rand(100,1000000);
$codeLen = strlen($code); // Taille du code
// On déplace le code dans une session afin de pouvoir le comparer plus facilement
$_SESSION['code'] = $code;
// On prépare l'image
$widthImg = $codeLen * 25;
$heightImg = 40;
$image = imagecreatetruecolor($widthImg, $heightImg);
$bgColor = imagecolorallocate($image, mt_rand(150,255),mt_rand(150,255),mt_rand(150,255));
imagefilledrectangle($image, 0, 0, $widthImg, $heightImg, $bgColor);
$fontNbr = array('fonts/1.ttf','fonts/2.ttf');
$fontLetter = array('fonts/3.ttf');
imagettftext($image, mt_rand(15,30), mt_rand(-45,15), 10, 35, imagecolorallocate($image, mt_rand(10,100) ,mt_rand(10,100),mt_rand(10,100)), $fontLetter[0], $code[0]);
for ($i = 1; $i < $codeLen; $i++) {
$widthX = 20 * $i + 30;
$heightY = mt_rand(25,40);
imagettftext($image, mt_rand(27,32), mt_rand(0,45), $widthX,$heightY, imagecolorallocate($image, mt_rand(10,100) ,mt_rand(10,100),mt_rand(10,100)), $fontNbr[mt_rand(0,1)], $code[$i]);
}
imagepng($image); // Enfin, on génère l'image
imagedestroy($image); // Puis on libère les ressources allouées
?>
Vous avez désormais un captcha utilisable (captcha.php), insérable comme une image normale.Nous allons ensuite remplacer le captcha texte par notre image.
Avec votre client FTP favoris, récupérez le fichier articles.php situé dans /themes/nom_de_votre_theme/articles.php
Modifiez ensuite les lignes suivantes :
<p><?php $plxShow->capchaQ(); ?> : <input name="rep" size="10" type="text"></p>
Par ceci :
<p><img src="captcha.php" alt="Captcha"> : <input name="rep" size="10" type="text"></p>
Ré-uploadez ensuite le fichier articles.php en remplaçant l'ancien fichier, et voilà, désormais votre captcha sera utilisé à la place de celui par défaut.La dernière étape consiste tout simplement à vérifier que le code entré par l'utilisateur (Ou le bot !) est valide. Si il est valide, alors le commentaire est posté, sinon, il ne l'est pas.
Récupérez le fichier class.plx.motor.php situé dans /core/lib/.
Modifiez ensuite les lignes suivantes (Ligne 755 dans la version actuelle) :
if($this->aConf['capcha'] == 0 OR $content['rep2'] == sha1($content['rep'])) {
Par ceci :
if($_POST['rep'] == $_SESSION['code']) {
Comme d'habitude, réuploadez ce fichier en écrasant l'ancien.Et puis voilà ! A mort le spam !
(J'ai copié-collé cet article de mon blog, l'article est ici, ça présente mieux !)
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Merci pour ces explications
D'un certaine façon tu viens de décrire le fonctionnement du plugin plxCapchaImage disponible ici http://www.pluxml.org/?static7/download
Un petit bémol avec ce plugin qui semble poser quelque problème chez certaines personnes.
Mais sinon le principe est identique à ta solution.
Consultant PluXml
Ancien responsable et développeur de PluXml (2010 à 2018)
Ah je ne connaissais pas du tout ce plugin, au moins ça fera toujours une petite alternative !
J'utilise très souvent ce captcha sur mes pages, à ma connaissance je n'ai jamais constaté de problème, si jamais j'en vois un je préviendrais ici.
Have fun, et longue vie à Plx.
Consultant PluXml
Ancien responsable et développeur de PluXml (2010 à 2018)
une autre solution anti-spam adoptée personnellement sur un autre cms, sans aucun capcha.
Un input texte est ajouté au formulaire et masqué via css (display:none).
On part d'une constatation simple : Les robots remplissent tous les champs d'un formulaire
Lors du traitement, ce champ doit tout simplement être vide pour que la validation ait lieu, ce qui sera le cas si le formulaire a été rempli par un vrai visiteur.
C'est transparent pour le visiteur (qui peut même être non-voyant, pas d'image à recopier) et c'est efficace.
Quant on peut faire simple
cordialement,
Ludo
Les bots ne remplissent pas forcément tous les champs, certains bots ont même des listes de noms générique de champs (par exemple, beaucoup de gens appellent leur champ contenant le pseudo "pseudo", ou "id") pour justement trouver les champs à remplir.
Donc oui, c'est une solution, mais si jamais ces pages sont très visitées et très rankées, cela attirera les bots, et bon nombre d'entre-eux arriveront à contourner cela très facilement
Pour ma part je suis convaincu qu'un captcha image reste la meilleure solution (Et encore, désormais certains petits malins arrivent à programmer des algo capable de reconnaître les lettres ou chiffres, mais heureusement ce n'est qu'assez peu répandu à l'heure actuelle)
Et oui, les bots de spam évoluent malheureusement bien vite...
c'est en effet simpliste mais il s'agit bien d'une constatation : méthode Testée depuis plus d'un an avec 100% des tentatives indésirables passées à la trappe. Cela m'a d'ailleurs étonné mais c'est logique :
Le seul moyen pour un bot de contourner l'astuce est d'analyser l'affichage réel du champ (la class css, en l'occurrence), sinon comment peut-il deviner qu'il s'agit d'un champ "piège" ? (qui peut être nommé "pseudo" d'ailleurs, ce qui plaira aux bots testant les noms de champs).
J'ai mis en place dès le début un moyen de récolter l'ip ainsi que le contenu des champs du formulaire pour chacune des tentatives "indésirables" (plusieurs chaque jour). A chaque fois, tous les champs sont effectivement remplis.
C'est là que le coté simpliste me plait bien, bien que l'efficacité constatée ne durera certainement pas éternellement )
Bien d'accord pour l'efficacité du capcha image. Mais il faut le compléter d'une solution "audible" si l'on consent à penser aux non-voyants.
Ludo
Jamais été embêté avec cette solution + champs invisible.
J'ai décalé la génération du mot de passe dans la méthode Q et là tout baigne. J'en ai profité également pour penser aux no ou mal voyants qui ont du mal avec ce type de capcha. Ils ont donc la possibilité de le désactiver pour revenir à la version capcha texte.
La version modifiée est disponible ici.
Qu'en pensez-vous?
Edit si je clique sur la case "difficultés à visionner l'image" cela ne fait rien
Super. Je vais testé
Merci de ton aide
Consultant PluXml
Ancien responsable et développeur de PluXml (2010 à 2018)
A priori Stéphane vient de la trouver
Pour le fait que rien ne se passe, c'est normal. Il faut soumettre le formulaire une première fois pour que l'image soit remplacée par le texte car il faut générer un nouvel index dans le tableau $_SESSION.
Il me faudrait des retours pour savoir si ça bloque encore ou si c'est définitivement résolu.
Je vais comparé ta solution Jerry avec ce que j'ai fait
Consultant PluXml
Ancien responsable et développeur de PluXml (2010 à 2018)
[edit]Pour que le formulaire soit soumis en javascript, il faut modifier la méthode plxShowCapchaQ, et remplacer le champ input name="malvoyant" par :
Par contre, cela implique que le bouton submit du formulaire n'ait pas un attribut name dont la valeur est submit, sinon le javascript plantera.
Est-ce que tu vérifies la concordance entre la question et la réponse ?
Lorsque le formulaire est soumis, il faut le vérifier en php. Par exemple, en faisant :
Le plugin disponible dans la partie téléchargements du blog: oui il fonctionne bien celui la, je croyais que Stéphane parlait du captcha dans les articles du blog de PluXml
Sinon ta correction fonctionne bien sauf que pour la version personne malvoyant en cliquant rien ne se passe même après avoir déjà posté.
Et si tu fais la modification en javascript, le formulaire devrait être posté dès que la case est cochée.
Je vais mettre cette modif javascript par défaut dans le zip.
Je vais essayer de corriger ça.
Est-ce que c'est mieux ?
et ajouter dans le construct :
J'ai mis à jour l'archive.
.
Je ne sais pas si je poste au bon endroit mais bon...
Malgré le plugin Image Capcha ke suis sévèrement spammé dans les commentaires de mes articles. Pour l'instant je les modère mais c'est palliatif comme solution.
.
Que puis-je faire ? J'utilise a priori la dernière version du plugin (1.0, vérifié à l'instant sur la page téléchargements de pluxml.org).
.
Merci pour votre aide.
.
Cordialement.