begin process at 2010 09 02 22:21:57
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > CAPTCHA (ANTI-SPAM)

CAPTCHA (ANTI-SPAM)


 Information sur la source

Note :
8 / 10 - par 2 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :captcha, antispam, question, réponse Niveau :Débutant Date de création :02/11/2006 Date de mise à jour :06/11/2006 13:56:49 Vu / téléchargé :6 768 / 468

Auteur : leviathan516

Ecrire un message privé
Site perso
Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

 Description

Les captcha (technique antispam) sont très régulièrement basés sur des images , ce qui les rends non accessibles pour les non-voyants ou mal-voyant.

Ce captcha est donc sous forme de question/réponse qui sont à configurer dans un fichier permettant ainsi d'avoir des questions aléatoires.
En plus de la simple validation ou non, j'ai ajouté la possibilité de blacklister durant une période donnée les personnes ne répondant pas correctement à une question.


 Conclusion

La configuration du captcha (redirection, blacklistage, durée du blacklistage, ...) se fait dans le fichier de la classe.
Les questions-réponses sont à mettre dans le fichier question_list.php
Ne pas oublier de donner les droits d'écriture sur le fichier FS_blacklist.txt (fichier contenant les adresses IP blacklistées)
Il y a deux versions de la classe: une à la norme php5 et l'autre pour php4, elles sont strictement identique, le seul changement réside dans l'utilisation des private et public ainsi que le nom du constructeur.

Un petit exemple d'utilisation est fournit dans le fichier zip.

 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

06 novembre 2006 13:56:49 :
Suite aux remarques de Kankrelune, j'ai amélioré mon code: - ajout de la possibilité de laisser un certain nombre d'essai avant blacklistage - ajout d'une variable permettant de définir le type de comparison lors de la réponse (sensible à la case ou non) - redirection vers une page d'erreur au lieu de la page Google - ajout de la fonction permettant d'ajouter une question et modification du constructeur

 Sources du même auteur

FONCTION DE "CRYPTAGE" D'ADRESSE MAIL

 Sources de la même categorie

Source avec Zip Source avec une capture MY.EXCEPTION par inwebo
SIMPLIFIEZ VOS CONNEXIONS FTP AVEC LEGFTP ! par leglopin
Source avec une capture CLASSE GÉNÉRATEUR DE CODES BARRES 2D DATAMATRIX par TorTukiTu
CLASSE MAIL par djguigui34400
Source avec Zip DÉBOGAGE D'UN CODE PHP (SUIVIT DES VARIABLES) par originalcompo

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture CAPTCHA VISUELLE par kankrelune
Source avec Zip CAPTCHA NON VISUELLE par kankrelune
Source avec Zip Source avec une capture CAPTCHA CALCUL / CARACTÈRE À LA XIÈME POSITION D'UNE CHAÎNE. par WanaDien
Source avec Zip Source avec une capture CAPTCHA ( ANTI-SPAM, ANTI-ROBOT ) par WanaDien
ANTI SPAM ET ANTI ROBOT : SECURISATION DE FORMULAIRE SANS C... par tkof

Commentaires et avis

Commentaire de coucou747 le 02/11/2006 12:15:50

euh... anti flood et non spam... t'as pas de réseau bayesien là dedans...

Commentaire de kankrelune le 02/11/2006 15:24:56

Moi ce que je reproche à ton code c'est qu'il faut entrer les questions à la mian... c'est fastidieux... le mieux serait de générer la question automatiquement comme par exemple sur php.net où il génèrent une opération mathématique simple avec les chiffres en toutes lettre et non en numérique... sinon c'est bien comme principe... par contre pas besoin de déclarer la super globale $_SESSION en globale elle l'est déja et plutot que d'inclure le fichier contenant les questions en début de class et ensuite de déclarer question comme global pour y acceder je pense qu'il serait mieux de l'inclure dans la méthode genre...

<fichier question_list.php>
<?php
   return array(
             array(
                  'q'  =>  'Quelle est la premi&egrave;re lettre de l\'alphabet ?',
                  'r'  =>  'a'
               ),

             array(
                  'q'  =>  'Quelle est la deuxi&egrave;me lettre de l\'alphabet ?,
                  'r'  =>  'b'
              ),

             array(
                  'q'  =>  'Quelle est la troisi&egrave;me lettre de l\'alphabet ?,
                  'r'  =>  'c'
                  )
);
</fichier question_list.php>

et dans le constructeur je ferais

$this->_question_list = include('question_list.php');

Comme ça la liste est chargée au moment de l'instanciation et non pas à chaque appel de la méthode generate()... tu notera l'utilisation d'un tableaux multi dimentionel car utiliser la question comme index de tableau c'est crade et ça risque de provoquer des erreurs... .. .

Perso voici comment je ferais...

<fichier question_list.php>
<?php

if(!defined('FS_CAPTCHA_IN_CORE')) exit();

$this->_addQuestion('Quelle est la premi&egrave;re lettre de l\'alphabet ?','a');
$this->_addQuestion('Quelle est la deuxi&egrave;me lettre de l\'alphabet ?,'b');
$this->_addQuestion('Quelle est la troisi&egrave;me lettre de l\'alphabet ?','c');

?>
</fichier question_list.php>

<fichier captcha.class.php>
<?php

define('FS_CAPTCHA_IN_CORE', true);

... .. .

class FS_captcha
{
     var $_question_list;
     var $_nb_question;

     function FS_captcha()
     {
         $this->_question_list = array();
         $this->_nb_question = 0;

         require('question_list.php');
     }

     function _addQuestion($question,$answer)
     {
         $this->_question_list[] = array(
                                        'question' => $question,
                                        'answer' => $answer
                                        );
         $this->_nb_question++;
     }
    
     function generate()
     {
         $num_question = array_rand($this->_question_list);
        
         $_SESSION['captcha_num'] = $num_question;
        
         return $this->_question_list[$num_question]['question'];
     }

    /*** le reste de la class ***/
}
</fichier captcha.class.php>

Sinon... rediriger sur un site qui ne t'appartient pas est interdit ça peut t'attirer des ennuis fais un exit ou provoque une erreur 403 plutot que de rediriger... tu devrais spécifier un nombre d'essais parce que si l'internaute se plante et que pan il est banni dès le premier essai c'est un peu brut de pomme, plutot que de faire un explode sur le contenu du fichier utilise file()  

Voili voilou... j'hésite entre 6 et 7/10 je met 7... .. .

@ tchaOo°

Commentaire de leviathan516 le 03/11/2006 13:05:15

merci beaucoup kankrelune pour toutes ces excellentes remarques.
Je vais regarder ça ce week end et mettre à jour ma source.

Les questions seront toujours à entrer à la main car j'estime qu'un système automatique est assez facilement contournable par un robot. Mais là c'est plus une question de goût qu'autre choses ;-)
Pour le banissement dès la première erreur, j'avoue que j'y réfléchi encore. Normalement les questions du captcha sont simples, et attendre 15 minutes n'est pas non plus terrible si on veut vraiment poster un commentaire. Donc, dans mon idée, je resterais certainement plus sur un banissement dès la première erreur. En même temps mettre en place, un système configurable du nombre d'échec autorisé n'est pas si compliqué. A voir, donc...

Merci pour tout.
Léviathan

Commentaire de kankrelune le 03/11/2006 13:31:52

"Les questions seront toujours à entrer à la main car j'estime qu'un système automatique est assez facilement contournable par un robot"

Ca dépend du système... php.net n'a pas de problème de troll au dernières nouvelles... .. . ;o)

"et attendre 15 minutes n'est pas non plus terrible si on veut vraiment poster un commentaire."

Sauf si tu utilise un navigateur multionglets que tu ouvre la page dans un onglet navigue sur d'autres pages le temps que cette dernière se charge zappe un peu puis reviens pour poster le commentaire... .. . ;o)

@ tchaOo°

Commentaire de leviathan516 le 06/11/2006 14:07:42

Bonjour,

j'ai mis ma source à jour suite aux remarques de Kankrelune.

Quelques différences par rapport à ce qu'il me proposait:
- pas de variable $_nb_question: aucune utilité dans mon code
- je n'ai pas utilisé file() à la place de explode(): file ajoute \n\r à la fin des ligne alors que j'ai l'habitude d'utiliser seulement \n. De plus il y a un risque de problème sous Windows (avec les \n et les \n\r). Etant donné qu'il s'agit de fonction assez similaire, je ferais des tests de rapidité sur les deux fonctions afin de voir les différences et j'en tirerais les conséquences. Si vous avez plus de renseignements sur ça, je suis tout à votre écoute.

Parmi les options disponibles, j'ai ajouté une option permettant de choisir entre un mode de comparaison sensible à la case ou non. J'ai également ajouté la possibilité de blacklister l'utilisateur qu'après un certain nombre d'échec.

Merci encore à Kankrelune pour ses remarques.

Commentaire de kankrelune le 06/11/2006 14:32:31

"- je n'ai pas utilisé file() à la place de explode(): file ajoute \n\r à la fin des ligne alors que j'ai l'habitude d'utiliser seulement \n. De plus il y a un risque de problème sous Windows (avec les \n et les \n\r). Etant donné qu'il s'agit de fonction assez similaire, je ferais des tests de rapidité sur les deux fonctions afin de voir les différences et j'en tirerais les conséquences. Si vous avez plus de renseignements sur ça, je suis tout à votre écoute."

Non file n'ajoute rien en fin de ligne... le \n\r est le format de retour à la ligne windows... sous Linux c'est \n et sous Mac c'est \r... au moins avec file() tu est sûr d'être crossplateforme... et si tu as peur tu peux toujours faire un rtrim() sur la line... .. . ;o)

http://fr2.php.net/file

Sinon ça m'a l'air plutot pas mal... par contre tout comme pour le backlistage je laisserais le choix de rediriger ou non sur une page... d'ailleurs à ce sujet plutot que d'utiliser des constantes qui ne servent qu'un ou deux fois il peut être bien de créer un attribut $conf qui stockerait la config sous forme de tableau associatif... les valeurs de configuration pouvant être changées via le constructeur et\ou un méthode... mais c'est un détail... .. . ;o)

@ tchaOo°

Commentaire de juki_webmaster le 15/11/2006 21:43:14

Moi à la limite je redigirais meme pas, je le ferais croire qu'il repond toujours aux captchas, si tu le bloque il reviendras avec une autre IP.

Commentaire de VVV le 20/07/2009 17:04:04

Salut :-)

J'aurais voulu intégrer ce système dans un formulaire php avec traitement des données dans une autre page.
Le formulaire comporte plusieurs champs à remplir, plus celui du captcha et de sa réponse.

Malheureusement je n'arrive pas à traiter les champs du formulaire après (en même temps? que) le captcha...
Comment pourrais-je envisager et la vérification du captcha et le traitement du formulaire en une seule et même opération ?

A toutes fins utiles, voici une partie du code :

<form method="POST" name="code" action="traitement.php">
<input type="text" size="4" maxlength="4" name="TB1" id="TB1">
<input type="text" size="4" maxlength="4" name="TB2" id="TB2">
<input type="text" size="4" maxlength="4" name="TB3" id="TB3">
<input type="text" size="4" maxlength="4" name="TB4" id="TB4" value="<?php echo $question; ?>">
<input type="text" size="4" maxlength="4" name="TB5" id="TB5">
<input type="submit" id="TB6" value="Valider">

</form>

Commentaire de leviathan516 le 20/07/2009 22:50:22

Bonjour,

voici un exemple tiré du fichier de test de la classe et modifié pour reprendre ton code.

<?php
session_start();

require_once "captcha.class.php";

$captcha = new FS_captcha();
$result = "";

if (isset($_POST["reponse"]) && !empty($_POST["reponse"])) {
  if ($captcha->check($_POST["reponse"])) {
    // traitement des autres champs du formulaire
    print_r($_POST);
  } else {
    die('erreur dans le captcha');
  }
}
$question = $captcha->generate();
?>
<html>
<head>
<title>Test</title>
</head>
<body>
<form method="POST" name="code" action="traitement.php">
<input type="text" size="4" maxlength="4" name="TB1" id="TB1">
<input type="text" size="4" maxlength="4" name="TB2" id="TB2">
<input type="text" size="4" maxlength="4" name="TB3" id="TB3">
<?php echo $question; ?> : <input type="text" size="4" maxlength="4" name="reponse" id="reponse" value="">
<input type="text" size="4" maxlength="4" name="TB5" id="TB5">
<input type="submit" id="TB6" value="Valider">
</form>
</body>
</html>

Commentaire de VVV le 21/07/2009 10:03:18 9/10

Super !
J'avais pensé modifier la class aussi au niveau de la redirection (si captcha Ok):
header("Location: traitement.php?info1=$TB1&info1=$TB2&info1=$TB3");
Mais je préfère ta solution. Merci :-)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

toujours pas de réponse pour mon question :-( [ par kia2112 ] je viens de creer une animation flash dynamique que je veux modifier son contenue sans retourner &#224; son code source,cela doit etre &#224; travers lister question + réponse dans une meme page [ par medicair ] Bonjour, J'ai deux tables 1 "questions" et 1 "r&#233;ponses", je voudrais lister les r&#233;ponses corespondantes&nbsp;&#224; chaque&nbsp;question, et affichage avant de changer de page [ par marco1981 ] Bonjour a tous, je fais un genre de questionaire en php, j'ais mes questions et mes réponse dans un base de donnée, j'affiche question par question, m petite question [ par biloutte33 ] bonjour,j'aimerais savoir un truc:dans certain site internet, il y a une liste de question qui renvoies chacune &#224; sa r&#233;ponse &#224; un endro Ocaml [ par nicomilville ] Salut,J'ai une petite question qui me trote dans la tête donc je me suis dit pourquoi ne pas la poser ici...Cette question, la voici :A quoi peut serv 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 question importante! [ par toutoos ] IMPORTANT !D'après vous! Pour moi le choix est très claire! Mais je préfère vous demander! Le mieu est de créer un site ou on propose des application Codage des base de données [ par cici19100 ] Bonjour, je gère un site, et un des utilisateur ma demandé s'il été posible de lui redonnée sont password. Mais celui ci est codé, ya til un moyen de migration vers V5 [ par Zebra1928 ] bonjour à tous !Je pose cette question car je n'ai pas trouvé de réponse !J'utilise actuellement PHP4 sur linux Redhat, je veux migrer vers la version Ajouter en mysql [ par thedeejay ] Salutations! je créé un jeu en ligne et j'ai une petite question:Chaque joueur possede un salaire, stocké dans la bdd dans do_membre , argent. Le prob


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Septembre 2010
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
27282930   

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,593 sec (3)

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