Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TEST DE TURING ACCESSIBLE - CLASSE PHP5


Information sur la source

Catégorie :Sécurité & Cryptage Classé sous : turing, captcha, accessible Niveau : Initié Date de création : 20/01/2007 Date de mise à jour : 20/01/2007 22:04:22 Vu / téléchargé: 4 080 / 128

Note :
Aucune note

Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
A force de voire fleurir partout des captcha imagée et aussi à force d'avoir à utiliser lynx, je me suis mis en tête de réaliser un test de turing qui soit accessible. Pour ce faire, j'utilise la méthode des questions simples posée à l'utilisateur.
 

Source

  • <?php
  • /*******************************************************************************
  • * Software: Turing Test class *
  • * Version: 0.2 *
  • * Date: 2007-01-20 *
  • * Author: William POTTIER *
  • * License: Freeware *
  • * *
  • * You may use, modify and redistribute this software as you wish. *
  • *******************************************************************************/
  • class Turing
  • {
  • // List of many word wich may be use.
  • private $dictionnary = array(
  • 'programmation',
  • 'interface',
  • 'variable',
  • 'apprentissage'
  • );
  • // List of questions types
  • private $questions = array(
  • 'Indiquer le résultat de la somme de %x et %y',
  • 'Indiquer le plus grand nombre entre %x et %y',
  • 'Indiquer la lettre n°%u du mot "%mot_z"',
  • 'Indiquer le plus petit nombre entre %x et %y'
  • );
  • // Results that corresponds with associated questions.
  • private $results = array(
  • 'addition(x,y)',
  • '_max(x,y)',
  • 'letterOfWord(u,mot_z)',
  • '_min(x,y)'
  • );
  • private $nb, $u, $x, $y, $z,$mot_z;
  • ////////////////////////////////////////
  • // Constructor : just many simple test
  • public function __construct()
  • {
  • // We check if Session is open
  • if(session_id() == '')
  • throw new Exception('Can\'t use Turing test because session is close.');
  • }
  • //////////////////////////////////////////
  • // a function for callback (for $results)
  • private function addition($a, $b)
  • {
  • return $a+$b;
  • }
  • //////////////////////////////////////////
  • // a function for callback (for $results)
  • private function letterOfWord($pos, $mot)
  • {
  • return $mot[$pos];
  • }
  • private function _max($a, $b)
  • {
  • return max(array($a, $b));
  • }
  • private function _min($a, $b)
  • {
  • return min(array($a, $b));
  • }
  • //////////////////////////////////////////////////////
  • // We pick a question from our list and we return it
  • public function GenerateQuestion($force_new = 0)
  • {
  • if($this->nb == '' || $force_new == 1)
  • $this->nb = mt_rand(0, count($this->questions)-1);
  • // We get the random number
  • $this->x = mt_rand(1, 50);
  • $this->y = mt_rand(1, 50);
  • $this->z = mt_rand(0, count($this->dictionnary)-1);
  • $this->mot_z = $this->dictionnary[$this->z];
  • $this->u = mt_rand(0,strlen($this->mot_z)-1);
  • // We get the result and we save it in $_SESSION
  • $_SESSION['turing'] = $this->GetResult();
  • $search = array('%x', '%y', '%mot_z', '%u');
  • $replace = array($this->x, $this->y, $this->mot_z, $this->u+1);
  • $question = str_replace($search, $replace, $this->questions[$this->nb]);
  • return $question;
  • }
  • ////////////////////////////////////////////////////////
  • // we return the result associated with the number $nb
  • private function GetResult()
  • {
  • $result = $this->results[$this->nb];
  • // We explode the string to get function name and param list
  • $temp1 = explode('(', $result);
  • // Good, wa have the callback
  • $callback = $temp1[0];
  • // Now the params
  • $params = trim($temp1[1], ')');
  • $param = explode(',', $params);
  • $count_param = count($param);
  • for($i = 0; $i < $count_param; $i++)
  • {
  • $param_callback[$i] = $this->$param[$i];
  • }
  • // We run the callback
  • return call_user_method_array($callback, $this, $param_callback);
  • }
  • }
  • ?>
<?php
/*******************************************************************************
* Software: Turing Test class                                                               *
* Version:  0.2                                                               *
* Date:     2007-01-20                                                         *
* Author:   William POTTIER                                                   *
* License:  Freeware                                                           *
*                                                                              *
* You may use, modify and redistribute this software as you wish.              *
*******************************************************************************/

class Turing
{
	// List of many word wich may be use.
	private $dictionnary = array(
 			'programmation',
			'interface',
			'variable',
			'apprentissage'
 			);
 	// List of questions types
	private $questions = array(
 			'Indiquer le résultat de la somme de %x et %y',
 			'Indiquer le plus grand nombre entre %x et %y',
 			'Indiquer la lettre n°%u du mot "%mot_z"',
 			'Indiquer le plus petit nombre entre %x et %y'
 			);
 	// Results that corresponds with associated questions.
	private $results = array(
	'addition(x,y)',
	'_max(x,y)',
	'letterOfWord(u,mot_z)',
	'_min(x,y)' 
	);
	private $nb, $u, $x, $y, $z,$mot_z;
	
	////////////////////////////////////////
	// Constructor : just many simple test
	public function __construct()
	{
	  	// We check if Session is open
		if(session_id() == '')
			throw new Exception('Can\'t use Turing test because session is close.');
	}
	
	//////////////////////////////////////////
	// a function for callback (for $results)
	private function addition($a, $b)
	{
		return $a+$b;
	}
	
	//////////////////////////////////////////
	// a function for callback (for $results)
	private function letterOfWord($pos, $mot)
	{
		return $mot[$pos];
	}
	
	private function _max($a, $b)
	{
		return max(array($a, $b));
	}
	
	private function _min($a, $b)
	{
		return min(array($a, $b));
	}
	
	//////////////////////////////////////////////////////
	// We pick a question from our list and we return it
	public function GenerateQuestion($force_new = 0)
	{
	  	if($this->nb == '' || $force_new == 1)
	  		$this->nb = mt_rand(0, count($this->questions)-1);
		
		// We get the random number
		$this->x = mt_rand(1, 50);
		$this->y = mt_rand(1, 50);
		$this->z = mt_rand(0, count($this->dictionnary)-1);
		$this->mot_z = $this->dictionnary[$this->z];
		$this->u = mt_rand(0,strlen($this->mot_z)-1); 
		
		// We get the result and we save it in $_SESSION
		$_SESSION['turing'] = $this->GetResult();
		
		$search = array('%x', '%y', '%mot_z', '%u');
		$replace = array($this->x, $this->y, $this->mot_z, $this->u+1);
		$question = str_replace($search, $replace, $this->questions[$this->nb]);
		  
		return $question;
	}
	
	////////////////////////////////////////////////////////
	// we return the result associated with the number $nb
	private function GetResult()
	{
		$result = $this->results[$this->nb];
		// We explode the string to get function name and param list
		$temp1 = explode('(', $result);
		// Good, wa have the callback
		$callback = $temp1[0];
		// Now the params
		$params = trim($temp1[1], ')');
		$param = explode(',', $params);
		$count_param = count($param);
		for($i = 0; $i < $count_param; $i++)
		{
			$param_callback[$i] = $this->$param[$i];
		}
		
		// We run the callback
		return call_user_method_array($callback, $this, $param_callback);
	}
}
?>

Conclusion

Voilà si vous avez des remarques, commentaires et suggestions n'hésiter pas.

Le petit exemple permet de montrer la mise en oeuvre d'un tel système et de la classe.

Pour ceux que ça intéresse, la classe utilise un système de callback pour le calcul des résultat.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

20 janvier 2007 19:30:43 :
Correction et ajout d'un exemple pour certain.
20 janvier 2007 22:00:18 :
réécriture complète pour une version exploitable.
20 janvier 2007 22:04:22 :
ajout du screenshot

Commentaires et avis

signaler à un administrateur
Commentaire de wizad le 20/01/2007 11:44:27

euh si un admin peut me dire pourquoi mon code n'est pas colorisé...

signaler à un administrateur
Commentaire de Springer le 20/01/2007 12:24:30

bonjour,
j'ai réperé deux erreurs dans ton code:
la fonction mtrand() s'écrit mt_rand(),
et pour l'affichage il faut écrire à la place de:
"echo $question.'<br /> Résultat : '.$resultat[$nb];"
ceci
echo $question_type[$nb].'<br /> Résultat : '.$resultat[$nb];
salutation

signaler à un administrateur
Commentaire de kankrelune le 20/01/2007 12:25:43

J'aime bien ce concept... utilisé notament par php.net... .. .

par contre...

$mot_z = $dictionnaire[$z];
$ar_mot_z = str_split($mot_z);
$u = mtrand(0, count($ar_mot_z)-1);

tu te complique la vie pour rien...

$mot_z = $dictionnaire[$z];
$u = mtrand(0,strlen($mot_z)-1);

(résultat : $mot_z[$u] ou $mot_z{$u})

@ tchaOo°

signaler à un administrateur
Commentaire de coucou747 le 20/01/2007 13:11:37

c'est interessant, mais cependant, ici, ça limite un robot générique de t'attaquer, je penses qu'un robot est au moins un peu modifié en fonction de la cible.... Ici, trois pregs, une addition, un $var[$pos], un max et un min et c'est règlé.... ce qu'il te faudrait, c'est plutot un truc genre : "cliquez sur la couleur la plus rouge", "cette image représente t'elle un lapin ?", et mettre beaucoup beaucoup de possibilitées.... Si il y en a très peu, alors ça devient vraiment facil à casser pour un robot ciblé pour ce site... Il faut aussi brouiller le code html en ajoutant des commentaires bidons, faisant s'afficher les questions à partir de javascript "brouillé" lui aussi, afficher des lettres "bizarement" en utilisant un tableau, j'avais montré ce principe... Je m'attaquerais surement à ce sujet ce soir, ça faisait longtemps que je n'avais pas trouvé de sujet pour coder en php, j'étais plutot sur un entrainement intensif en algorithmique, java, et apprentissage de la STL, sans compter quelques projets (club robo) et des choses marrantes, mais je ne faisais quasiment plus de php...

faut donc coder :
-un brouilleur de code (un bien puissant) pour éviter les pregs
-un truc qui peut fournir une question aléatoire, et les types de paramètrès dont elle a besoin, faut aussi charger la fonction qui calcule la réponse
-un truc qui permette la vérification...

signaler à un administrateur
Commentaire de wizad le 20/01/2007 14:26:08

Je ferais les modifs pour les erreurs de code d'ici demain soir ayant un week end chargé.

@coucou : ""cliquez sur la couleur la plus rouge", "cette image représente t'elle un lapin ?"", malheureusement un tel système est complètement inaccessible au mal-voyant... ce qui est contraire au but recherché par mon système. Je suis d'accord qu'il faudrais quelque chose de plus solide mais à condition que cela reste en respect des contrainte d'accessibilité.

signaler à un administrateur
Commentaire de wizad le 20/01/2007 14:26:49

Et sinon il n'y a plus la colorisation des sources ou bien j'ai raté un truc?

signaler à un administrateur
Commentaire de juki_webmaster le 20/01/2007 18:37:01

Deux mauvais points:
- Tu aurais put partager ton code en une ou plusieurs fonction, pour faire un code "portable".
- Où est la fonction de verification ?

Sinon oué l'idée as du bon.
Debug inutile, ta source doit deja etre apte a etre utilisé en production quand elle est publié.

Bonne continuation.

signaler à un administrateur
Commentaire de wizad le 20/01/2007 19:17:48

sauf que j'ai précisé poster préalablement l'algorithme afin d'améliorer celui-ci.

"- Tu aurais put partager ton code en une ou plusieurs fonction, pour faire un code "portable"."
=> Non je ferais une classe.

"- Où est la fonction de verification ?"
=> Aller je te donne même la fonction d'enregistrement

$_SESSION['turing'] = $resultat[$nb];

et pour faire la vérification :
if($_POST['saisie_turing'] == $_SESSION['turing'])
    echo'Ouai tu ne t'es pas trompé.';
else
    echo'dis donc le robot on reste pas là.';

signaler à un administrateur
Commentaire de juki_webmaster le 20/01/2007 19:53:47

"Correction et ajout d'un exemple pour certain."
La moindre des choses est d'expliquer le fonctionnement d'un code, non ? tu auras bien codé des lignes spaghetti, si tu explique pas les entrés & sorties à qoui bon partager le code ? !

"=> Non je ferais une classe."
Pour mettre la sauce Boulognaise dedans ? deja met une fonction qui entoure le code c'est deja ça de gagner ! et ensuite tu tu veux enfile ça dans une class.

signaler à un administrateur
Commentaire de wizad le 20/01/2007 22:02:09

Hop nouvelle version réécrite (même algo mais plus exploitable).

Je reste ouvert au critique.

signaler à un administrateur
Commentaire de Kirua le 21/01/2007 11:49:01

J'aime bien moi ^^ Ceci dit, coucou a raison: tu bloqueras les crawler, mais pas les attaques ciblées. Ca mérite réflexion ^_^.

Par contre, ce que tu proposes coucou n'est pas forcément une réponse à son besoin: il voudrais un test accessible sous un browser text comme lynx: donc pas d'images ni de couleurs trop libres.

signaler à un administrateur
Commentaire de wizad le 23/01/2007 09:25:52

Alors coucou le résultat de tes investigations?

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Lien vers une page web [ par GIRAFE ENRHUMEE ] Y-a-t-il un moyen pour que une des pages de mon site ne soit pas accessible par son url. Autrement dit, qu'elle ne soit accessible que par le biais d' probleme affichage captcha [ par Jarod1980 ] Jarod_Delaware Redirection sur un fichier non accessible via le web [ par codefalse ] Bonjour à tous.Voila, j'ai un soucis, j'aurai une solution, mais je me demandais s'il y avait plus performant ! :)Alors ce qu'il en estVoici ma struct Vérifier Données [ par xeroxiss ] Bonjour,Ma question va peut-être paraître stupide mais je nage un peu ^^ Ma question toute bête est la suivante : Existe-t-il une requête en php qui v CAPTCHA [ par hlbmatos ] J'ai installé cryptographp dans mon livre d'or mais quoi que je fasse, quand j'envoie un message vers mon livre d'or, il n'est pas vérifié par le cryp Pb pour rafraichir un captcha [ par sebastien_et_typh ] Bonsoir,je rencontre 2 problèmes : - Le premier : j'ai installer un captcha sur mon site lors de l'inscription (j'avais pris le code de ce captcha ici comment afficher un captcha à la fin d'un formulaire ? [ par tiger159 ] Bonjour,j'aimerais savoir comment intégrer un captchaà la suite de l'affichage d'un formulaire.(Il semble que ce soit dû à 'header' qui a déjàenvoyé s Formulaire de contact compatibilité avec free.fr [ par adamtheboss ] Bonjour,J'ai créé un site chez free.fr où j'ai integré un script contact captcha, j'ai aussi créé un dossier sessions vide à la racine du site. Le for


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,437 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.