Captcha non visuelle

Description

En réponse à...

http://www.phpcs.com/code.aspx?ID=42504

et parce que c'est chiant de proposer une correction du codes des autres dans les commentaires (indentation, coloration)... si ça gène les admin qu'il n'hésitent pas à me le dire pour que je ne réitère pas... ... .. .

Donc comme son nom l'indique c'est une captcha non visuelle... un coup il faut faire une opération simple (addition, soustraction ou multiplication) l'opération étant affichée soit avec des chiffres et l'opérateur de calcul soit en toutes lettres, un autre coup il faut trouver le caractère se trouvant à la position donnée ou alors il faut trouver la lettre se trouvant entre les deux lettres énoncées... .. .

Avantage : est compatible avec les navigateur en mode texte pour les malvoyants
Désavantage : plus facile à casser qu'une bonne captcha visuelle, encore faut il que le bot soit fait spécifiquement pour ce code, cela reste donc largement suffisant pour la plupart des sites (système semblable utilisé par php.net)

Source / Exemple :


<?php

 
 /*

  • Created on 7 mai 07
*
  • @autor : The Kankrelune
  • @copyright : The WebFaktory © 2006/2007
  • /
function _captchaLettres() { $str = 'abcdefghijklmnopqrstuvwxyz';// on crée la chaine $str .= strtoupper($str); $length = mt_rand(5,12); $str = substr(str_shuffle($str),0,$length); $pos = mt_rand(2,$length-1); // on choisi la position if(!isset($_SESSION))// on met le résultat en session puis on renvois la question session_start(); $_SESSION['captchaResult'] = $str[$pos-1]; return 'Dans <b>'.$str.'</b> quelle lettre se trouve entre <b>'.$str[$pos-2].'</b> et <b>'.$str[$pos].'</b>'; } function _captchaCalculChiffres() { $operators = array('-','+','*'); $operator = $operators[array_rand($operators)];// on récupère l'opérateur de calcul $nb1 = rand(1, 10); $nb2 = ($operator === '-') ? mt_rand(1, $nb1) : mt_rand(1, 10); // on évite les résultats négatif en cas de soustraction $calcul = $nb1.' '.$operator.' '.$nb2; if(!isset($_SESSION))// on met le résultat en session puis on renvois la question session_start(); eval('$_SESSION[\'captchaResult\'] = strval('.$nb1.$operator.$nb2.');'); return 'Combien font <b>'.$nb1.' '.($operator === '*' ? 'x' : $operator).' '.$nb2.'</b>'; } function _captchaCalculLettres() { $operators = array('-' => 'moins', '+' => 'plus', '*' => 'fois'); $operator = array_rand($operators); $op = $operators[$operator]; // on récupère l'opérateur de calcul $num = array( 'zero', 'un', 'deux', 'trois', 'quatre', 'cinq', 'six', 'sept', 'huit', 'neuf', 'dix' ); $nb1 = array_rand($num); $nb2 = array_rand($num); if($operator === '-' && $nb1 < $nb2) while($nb1 < ($nb2 = array_rand($num))); // on évite les résultats négatif en cas de soustraction if(!isset($_SESSION)) // on met le résultat en session puis on renvois la question session_start(); eval('$_SESSION[\'captchaResult\'] = strval('.$nb1.$operator.$nb2.');'); return 'Combien font <b>'.$num[$nb1].' '.$op.' '.$num[$nb2].'</b>'; } function _captchaAlphaNum() { $str = md5(time()); // création de la chaine $length = mt_rand(5,12); $str = substr($str,0,$length); $pos = mt_rand(1,$length); // on choisi la position if(!isset($_SESSION))// on met le résultat en session puis on renvois la question session_start(); $_SESSION['captchaResult'] = $str[$pos-1]; if($pos === 1) $pos = 'le premier'; elseif($pos === 2) $pos = 'le second'; elseif($pos === $length) $pos = 'le dernier'; elseif($pos === ($length-1)) $pos = 'l\'avant dernier'; else $pos = 'le '.$pos.'ème'; return 'Quel est '.$pos.' caractère dans <b>'.$str.'</b>'; } function getCaptcha() { $functions = array( '_captchaLettres', '_captchaCalculChiffres', '_captchaCalculLettres', '_captchaAlphaNum' ); $captcha = $functions[array_rand($functions)]; return $captcha(); } function checkCaptcha( $postVarName = 'captchaResult', $caseInsensitive = false) { if(!isset($_SESSION)) session_start(); if(!isset($_POST[$postVarName],$_SESSION['captchaResult'])) return false; if($caseInsensitive === true && !is_numeric($_SESSION['captchaResult'])) { $_POST[$postVarName] = strtolower($_POST[$postVarName]); $_SESSION['captchaResult'] = strtolower($_SESSION['captchaResult']); } return ($_POST[$postVarName] === $_SESSION['captchaResult']); } ?>

Conclusion :


Voila c'est très simple mais au moins c'est propre... après il suffit de faire... .. .

<?php echo getCaptcha(); ?>

Inutile de vous expliquer comment faire la vérification (enfin j'espère) le résultat étant stocké dans $_SESSION['captchaResult']

^_^

@ tchaOo°

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.