Améliorer le captcha des commentaires pour plus de sécurité (Spam)

MordredMordred Member
décembre 2011 modifié dans Modifications
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 :
<?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 !)
«1

Réponses

  • StéphaneStéphane Member, Former PluXml Project Manager
    Bonjour Mordred

    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)

  • Bonjour Stéphane,

    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.
  • StéphaneStéphane Member, Former PluXml Project Manager
    Merci à toi

    Consultant PluXml

    Ancien responsable et développeur de PluXml (2010 à 2018)

  • Sinon, le plugin askimet de Stéphane marche au poil ^^
  • Bonjour,

    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
  • MordredMordred Member
    décembre 2011 modifié
    Uhm pour ma part je trouve la solution dans le message précédent un peu trop simpliste. Certe à l'heure actuelle elle fonctionne, mais tôt ou tard certains spams passeront assurément :/

    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...
  • Ludo_17Ludo_17 Member
    décembre 2011 modifié
    Bonsoir Mordred,

    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
  • Un truc tout simple aussi, mettre un chronomètre et si le formulaire est rempli en moins de 10s on considère que c’est du spam.
    Jamais été embêté avec cette solution + champs invisible.
  • Jerry WhamJerry Wham Member
    octobre 2012 modifié
    Je viens de modifier le plugin plxCapchaImage car il était buggué. En effet, le mot enregistré en session était renouvellé systématiquement entre l'appel de la fonction Q et celui de la fonction R puisque généré à chaque appel de la méthode construct.
    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?
  • bankaibankai Member
    janvier 2012 modifié
    je vais testé ta mise à jour, pourquoi ne pas la proposer à Stéphane ?
    Edit si je clique sur la case "difficultés à visionner l'image" cela ne fait rien :)
  • StéphaneStéphane Member, Former PluXml Project Manager
    Jerry Wham a écrit:
    Je viens de modifier le plugin plxCapchaImage car il était buggué. En effet, le mot enregistré en session était renouvellé systématiquement entre l'appel de la fonction Q et celui de la fonction R puisque généré à chaque appel de la méthode construct.
    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?

    Super. Je vais testé ;)
    Merci de ton aide

    Consultant PluXml

    Ancien responsable et développeur de PluXml (2010 à 2018)

  • bankai a écrit:
    je vais testé ta mise à jour, pourquoi ne pas la proposer à Stéphane ?
    Edit si je clique sur la case "difficultés à visionner l'image" cela ne fait rien :)

    A priori Stéphane vient de la trouver :p
    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.
  • StéphaneStéphane Member, Former PluXml Project Manager
    C'est vrai que j'ai fait une correction il y a quelque temps avec le capchaimage dispo sur le blog de pluxml.org.
    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)

  • ca bloque, mon commentaire est en cours de modération, j'ai du mettre 5 captcha avant que cela soit pris en compte, ils étaient bons pourtant.
  • Jerry WhamJerry Wham Member
    janvier 2012 modifié
    Jerry Wham a écrit:
    bankai a écrit:
    je vais testé ta mise à jour, pourquoi ne pas la proposer à Stéphane ?
    Edit si je clique sur la case "difficultés à visionner l'image" cela ne fait rien :)

    A priori Stéphane vient de la trouver :p
    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.


    [edit]Pour que le formulaire soit soumis en javascript, il faut modifier la méthode plxShowCapchaQ, et remplacer le champ input name="malvoyant" par :
    <input name="malvoyant" type="checkbox" onclick="this.form.submit();"/>
    

    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.
  • Jerry WhamJerry Wham Member
    janvier 2012 modifié
    bankai a écrit:
    ca bloque, mon commentaire est en cours de modération, j'ai du mettre 5 captcha avant que cela soit pris en compte, ils étaient bons pourtant.

    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 :
    $error = false;
    if($_POST['malvoyant'] == 'on')
       $error = 'Veuillez répondre à la question anti-spam';
    if($_POST['rep2'] != sha1($_POST['rep']) && $_POST['malvoyant'] != 'on')
       $error = 'Réponse anti-spam incorrecte';
    if(!error)
       echo 'Cool';
    else
       echo $error;
    
  • Sur le blog de Pluxml pas le miens ^^, sur le miens le captcha fonctionne bien :)
  • Quand tu dis "sur le blog de Pluxml", ça veut dire quoi ? Parce que, par défaut, pluxml n'a pas de formulaire en partie publique. Il faut ajouter un plugin ou créer une page statique ou modifier une page du thème pour en avoir un. Et dans ces conditions, il faut vérifier la concordance entre question et réponse du capcha.
  • Donc oui ^^
    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é.
  • Comment ça rien ne se passe ? Si tu soumets le formulaire et que tu as ajouté la vérification de la concordance entre question et réponse telle que je l'ai décrite dans un de mes posts plus haut, il devrait se passer quelque chose.

    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.
  • en faite je ne dois pas avoir compris, normalement si tu coche la case malvoyant l'image derrière les lettre devrait disparaître non ?
  • oui c'est ça. Mais en effet, le javascript ne fonctionne pas chez mon hébergeur alors que ça fonctionne en local.

    Je vais essayer de corriger ça.
  • oki, je test des que la mis en ligne ;)
  • Jerry WhamJerry Wham Member
    octobre 2012 modifié
    Je viens de mettre le plugin à jour ainsi que le plugin plxMyContact afin que les erreurs s'affichent correctement.

    Est-ce que c'est mieux ?
  • je vais testé le plugin captcha^^
  • Alors, ça donne quoi ce test ?
  • Jerry WhamJerry Wham Member
    octobre 2012 modifié
    Modification et prise en compte du handicap visuel dans les commentaires :
    	/**
    	 * Méthode pour valider le capcha dans un commentaire d'article
    	 *
    	 * @author Cyril MAGUIRE
    	 */
    	public function plxMotorNewCommentaire() {
    		if (!isset($_SESSION['malvoyant'])){
    			if ($_POST['malvoyant'] == 'on'){
    				$_SESSION['malvoyant']=true;
    			}
    		}
    	}
    

    et ajouter dans le construct :
    		$this->addHook('plxMotorNewCommentaire', 'plxMotorNewCommentaire');
    

    J'ai mis à jour l'archive.
  • Jerry, le lien ne fonctionne plus
  • Désolé. C'est corrigé.
  • Bonsoir et meilleurs voeux 2013 à tous,
    .
    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.
Connectez-vous ou Inscrivez-vous pour répondre.