CAPTCHA (ANTI-SPAM)

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 2 nov. 2006 à 12:15
cs_VVV Messages postés 40 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 15 juin 2009 - 21 juil. 2009 à 10:03
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/40180-captcha-anti-spam

cs_VVV Messages postés 40 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 15 juin 2009
21 juil. 2009 à 10:03
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 :-)
leviathan516 Messages postés 4 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 20 juillet 2009
20 juil. 2009 à 22:50
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>

<form method="POST" name="code" action="traitement.php">

<?php echo $question; ?> :


</form>

</html>
cs_VVV Messages postés 40 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 15 juin 2009
20 juil. 2009 à 17: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">



">



</form>
juki_webmaster Messages postés 947 Date d'inscription mercredi 19 novembre 2003 Statut Membre Dernière intervention 5 avril 2008 3
15 nov. 2006 à 21:43
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.
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
6 nov. 2006 à 14:32
"- 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°
leviathan516 Messages postés 4 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 20 juillet 2009
6 nov. 2006 à 14:07
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.
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
3 nov. 2006 à 13:31
"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°
leviathan516 Messages postés 4 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 20 juillet 2009
3 nov. 2006 à 13:05
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
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
2 nov. 2006 à 15:24
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ère lettre de l\'alphabet ?',
'r' => 'a'
),

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

array(
'q' => 'Quelle est la troisiè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ère lettre de l\'alphabet ?','a');
$this->_addQuestion('Quelle est la deuxième lettre de l\'alphabet ?,'b');
$this->_addQuestion('Quelle est la troisiè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°
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
2 nov. 2006 à 12:15
euh... anti flood et non spam... t'as pas de réseau bayesien là dedans...
Rejoignez-nous