begin process at 2012 02 15 09:41:52
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Sécurité & Cryptage

 > TEST DE TURING ACCESSIBLE - CLASSE PHP5

TEST DE TURING ACCESSIBLE - CLASSE PHP5


 Information sur la source

Note :
Aucune note
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é :5 473 / 142

Auteur : wizad

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
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

Les Membres Club peuvent 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

 Sources du même auteur

CLASSE DE SESSION ET D'AUTHENTIFICATION
Source avec Zip KIETU V4.0.0 BETA2

 Sources de la même categorie

Source avec Zip Source avec une capture ACCÈS, ESPACE MEMBRE AVEC INSCRIPTION ET DÉSINSCRIPTION PAR ... par stephelle
Source avec Zip CRYPTAGE REVERSIBLE par Mokost
Source avec Zip Source avec une capture CREATION DE COMPTE AVEC CRYPTAGE ET ESPACE DE CONNEXION SEC... par bm1982
Source avec Zip PROTÉGEZ VOS LIENS DE TÉLÉCHARGEMENT PAR MOT DE PASSE ET/OU ... par unlien
CRYPTAGE/DECRYPTAGE MCRYPT par sephirothgeek

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture FORM TO MAIL AVEC PROTECTION PAR TOKEN ET CAPTCHA CONTRÔLES ... par cod57
Source avec Zip PROTÉGEZ VOS LIENS DE TÉLÉCHARGEMENT PAR MOT DE PASSE ET/OU ... par unlien
Source avec Zip Source avec une capture FORMULAIRE VERS COURRIEL BASIQUE AVEC CONTRÔLE CAPTCHA ANTI ... par cod57
Source avec Zip Source avec une capture GÉNÉRATION DE FORMULAIRES HTML PERSONNALISÉS. par beejeridou
Source avec Zip Source avec une capture CAPTCHA ANTI-BOT + FICHIER SON (WAV) par nax333

Commentaires et avis

Commentaire de wizad le 20/01/2007 11:44:27

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

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

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°

Commentaire de coucou747 le 20/01/2007 13:11:37 administrateur CS

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...

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é.

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?

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.

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à.';

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.

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.

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.

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 Buzii Captcha et fiabilité ! [ par kikifrance ] Salut chez vous ! J'aimerais votre avis sur la fiabilité d'un Captcha tel que celui-ci: [url=http://www.buzii.com/buzii_captcha.php]http://www.buzii [BAR]Crack Captcha [ par kohntark ] Salut, Je me permet de poster ici car, même si il concerne avant tout le développement Web, le sujet fait en priorité appel à d'autres langages "plus


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,686 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales