Captcha non visuelle

Soyez le premier à donner votre avis sur cette source.

Vue 10 796 fois - Téléchargée 510 fois

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

Ajouter un commentaire

Commentaires

Messages postés
1293
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015

Mais de rien... si ça plait et si c'est utile moi ça me va... .. .

Pour le captcha visuel hésite pas si tu as des questions... .. .

@ tchaOo°
Messages postés
58
Date d'inscription
vendredi 29 août 2003
Statut
Membre
Dernière intervention
25 octobre 2010

Cher kankrelune, j'utilise ce code avec beaucoup de bonheur, je l'ai adapté à ma page sans problème et traduit en anglais. Merci pour tous les commentaires que tu as mis, ils sont très "pédagogiques et bienvenus.
Je n'ai pas eu autant de bonheur avec le captcha visuel que tu as proposé ailleurs, pas eu le courage de lutter pour le faire fonctionner.Merci encore.
Messages postés
1293
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015

Normal... tu confond javascript et php... langage interprété coté client et langage interprété coté serveur... .. .

@ tchaOo°
Messages postés
3
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
11 janvier 2008

j'ai essayer d'integrer le script mais sans resultat :

fonction:

function check(form) {

if (isNaN(document.getElementById('altnr').value))
{
alert("Numéro de téléphone erroné");
return false;
}else if (document.getElementById('altnr').value.length < 9)
{
alert("Numéro de téléphone erroné");
return false;
}else if (document.getElementById('altnr').value.substr(0,1)=="0" || document.getElementById('altnr').value.substr(0,1)=="1" ||document.getElementById('altnr').value.substr(0,1)=="2" || document.getElementById('altnr').value.substr(0,1)=="3"||document.getElementById('altnr').value.substr(0,1)=="4"||document.getElementById('altnr').value.substr(0,1)=="5"||document.getElementById('altnr').value.substr(0,1)=="7"||document.getElementById('altnr').value.substr(0,1)=="8"||document.getElementById('altnr').value.substr(0,1)=="9")
{
alert("Numéro de téléphone erroné");
return false;
}
if(checkCaptcha('captcha') === false)
{
alert("Mauvaise réponse");
return false;
}
else
submit;
}
}

ensuite:
<?php echo getCaptcha(); ?> :



Mon numero est bien verifier mes mpas mon captcha
Messages postés
1293
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015

Pour la vérification utilise checkCaptcha()...

if(checkCaptcha('leNomDeMonChampDeFormulaire') === true)
{
/*
* Le code gérant l'insertion du message
*/
}
else // le code soumis est mauvais gestion de l'erreur

@ tchaOo°
Afficher les 18 commentaires

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.