En rapport avec l’article de Renard du dézert, qui montre les différents les différents type de captcha possibles, j’ai voulu montrer que les captchas css sont également cassables.
Cela m’a pris environ une heure, et voila le code. J’imagine que les outils de spams massifs sauront également déjouer ce type de procédure, mais en ce qui me concerne, je ne saurais trop vous conseiller de rester sur les anti spams standards à base de textes / chiffres aléatoires.
<?php /* Auteur : Yohann Nizon Url: http://www.gameandme.fr Code qui démontre que meme le captcha CSS est cassable. Pauvre de nous ! En rapport a l article http://www.renardudezert.com/2011/11/10/les-captchas-les-plus-simples-sont-souvent.html#comments */ $timeout= 30; $sUrl = "http://scripts.renardudezert.com/captchas/breakthiscaptcha.php"; $c = curl_init(); /*L'url est celle de la page courante pour que le script s'appel lui même*/ curl_setopt($c, CURLOPT_URL, $sUrl); /*On indique à curl de nous retourner le contenu de la requête plutôt que de l'afficher*/ curl_setopt($c, CURLOPT_RETURNTRANSFER, true); /*On indique à curl de ne pas retourner les headers http de la réponse dans la chaine de retour*/ curl_setopt($c, CURLOPT_HEADER, false); curl_setopt($c, CURLOPT_TIMEOUT, $timeout); /*On execute la requete*/ $output = curl_exec($c); $docXML = new DomDocument(); if (@$docXML->loadHTML($output)){ //Recup du captcha $sXPath="//div[@class='css-captcha-code']/div/div"; $xpath = new DOMXPath($docXML); $lNodes = $xpath->query($sXPath); $tabResult = array(); $tab = rec($lNodes,0,"", $tabResult); //Affichage de la page echo $output; //Tri des resultats ksort($tabResult); //Affichage des resultats foreach ($tabResult as $s){ echo $s. " "; } } curl_close($c); /* Fonction recursive qui parcourt les divs On renvoie un tableau de resultats dont chaque lettre est indexé sur la profondeur et le float */ function rec($lNodes, $iCpt, $sCle, &$tabResult){ $tab = array(); $tabLeft = array(); $tabRight = array(); if (count($lNodes) > 0){ $iNode = 0; foreach ($lNodes as $oNode) { if ($oNode->nodeName == "div"){ $iNode++; $sCle2 = $sCle; if (strpos($oNode->getAttribute("style"),"float:left") !== false){ $sCle2 .= $iCpt."l".$iNode; }else{ $sCle2 .= $iCpt."r".$iNode; } $iNbChild = 0; foreach ($oNode->childNodes as $o){ if ($o->nodeName == "div"){ $iNbChild++; } } if ($iNbChild>0){ $tab[] = rec($oNode->childNodes, $iCpt+1, $sCle2, $tabResult); }else{ $tab[$sCle2] = $oNode->nodeValue; $tabResult[$sCle2] = $oNode->nodeValue; } } } } return $tab; } ?>