Casser un captcha CSS

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;
}
?>

Laisser un commentaire

*