begin process at 2012 05 27 22:03:33
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Sécurité & Cryptage

 > CAPTCHA CALCUL / CARACTÈRE À LA XIÈME POSITION D'UNE CHAÎNE.

CAPTCHA CALCUL / CARACTÈRE À LA XIÈME POSITION D'UNE CHAÎNE.


 Information sur la source

Note :
Aucune note
Catégorie :Sécurité & Cryptage Classé sous :sécurité, captcha, calcul, antispam, antirobot Niveau :Débutant Date de création :30/04/2007 Date de mise à jour :30/04/2007 06:37:42 Vu / téléchargé :6 503 / 204

Auteur : WanaDien

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

 Description

Cliquez pour voir la capture en taille normale
Suite au problème qu'il y a avec les captcha à image ( problème visuel ), j'ai fais 2 autres types de captcha.

Captcha n°1 :
Il génère une chaîne de x caractères aléatoire( minuscule, majuscule ), et un nombre aléatoire y.
La personne doit écrire le caractère qui se trouve à la position y de la chaîne x ( les minuscules sont différenciés des majuscules lors de la comparaison )

Captcha n°2 :
Un calcul aléatoire est généré (+,-,*,/) si c'est une division, le calcul doit être arrondi à l'entier par défaut ( un exemple s'affiche donc )

Source

  • <?php session_start(); ?>
  • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  • <html>
  • <head>
  • <title>Captcha</title>
  • </head>
  • <body>
  • <?php
  • srand();
  • echo "<u>Captcha 1</u><br /><br />";
  • $caracteres = array('A','Z','E','R','T','Y','U','I','O','P','Q','S','D','F','G','H','J','K','L','M','W','X','C','V','B','N','a','z','e','r','t','y','u','i','o','p','q','s','d','f','g','h','j','k','l','m','w','x','c','v','b','n');
  • $mini = rand(5,10);
  • $maxi = rand(10,20);
  • $longueurdelachaine = rand($mini,$maxi);
  • for($i = 1; $i <= $longueurdelachaine; $i++)
  • {
  • $chaine .= $caracteres[rand(0,51)]; //on concatène à chaque fois la variable $chaine
  • }
  • $position = rand(5,$longueurdelachaine);
  • $indice = $position -1;
  • $_SESSION['resultatcaptcha1'] = substr($chaine, $indice, 1); //on extrait UN caractère à la position $indice
  • echo "Voici la chaîne de caractère : <b>$chaine</b><br />";
  • echo "Quel est le caractère à la position <b>$position</b> ?<br /><br />";
  • ?>
  • <form method="post" action="verificationcaptcha1.php">
  • Votre réponse : <input type="text" name="reponsecaptcha1" value="" />
  • <input type="submit" value="Valider" />
  • </form>
  • <?php
  • echo "<br /><u>Captcha 2</u><br /><br /><br />";
  • $signes = array('-','+','*','/');
  • $nombre1 = rand(100,200);
  • $nombre2 = rand(1,100);
  • $lesigne = $signes[rand(0,3)];
  • $calcul = "$nombre1$lesigne$nombre2"; //pour afficher le calcul sans le calculer
  • echo "Combien font : <b>$calcul</b><br />";
  • if($lesigne == '/')
  • {
  • $resultat = $nombre1/$nombre2;
  • echo "Arrondissez à l'entier défaut.<br />";
  • echo "<u>Exemple</u><br /> Pour (0 <= x <= 4), 12.x donnera 12<br />Pour (5 <= x <= 9), 12.x donnera 13<br /><br />";
  • }
  • else
  • if($lesigne == '*')
  • $resultat = $nombre1*$nombre2;
  • else
  • if($lesigne == '+')
  • $resultat = $nombre1+$nombre2;
  • else
  • $resultat = $nombre1-$nombre2;
  • $_SESSION['resultatcaptcha2'] = round($resultat); //arrondi à l'entier par défaut.
  • ?>
  • <form method="post" action="verificationcaptcha2.php">
  • Votre réponse : <input type="text" name="reponsecaptcha2" value="" />
  • <input type="submit" value="Valider" />
  • </form>
  • </body>
  • </html>
<?php session_start(); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
	<title>Captcha</title>
</head>

<body>

<?php

srand();

echo "<u>Captcha 1</u><br /><br />";
$caracteres = array('A','Z','E','R','T','Y','U','I','O','P','Q','S','D','F','G','H','J','K','L','M','W','X','C','V','B','N','a','z','e','r','t','y','u','i','o','p','q','s','d','f','g','h','j','k','l','m','w','x','c','v','b','n');
$mini = rand(5,10);
$maxi = rand(10,20);
$longueurdelachaine = rand($mini,$maxi);
for($i = 1; $i <= $longueurdelachaine; $i++)
{
	$chaine .= $caracteres[rand(0,51)]; //on concatène à chaque fois la variable $chaine
}



$position = rand(5,$longueurdelachaine);
$indice = $position -1;

$_SESSION['resultatcaptcha1'] = substr($chaine, $indice, 1); //on extrait UN caractère à la position $indice

echo "Voici la chaîne de caractère : <b>$chaine</b><br />";
echo "Quel est le caractère à la position <b>$position</b> ?<br /><br />";
?>

<form method="post" action="verificationcaptcha1.php">
	Votre réponse : <input type="text" name="reponsecaptcha1" value="" />
	<input type="submit" value="Valider" />
</form>

<?php

echo "<br /><u>Captcha 2</u><br /><br /><br />";
$signes = array('-','+','*','/');
$nombre1 = rand(100,200);
$nombre2 = rand(1,100);
$lesigne = $signes[rand(0,3)];

$calcul = "$nombre1$lesigne$nombre2"; //pour afficher le calcul sans le calculer

echo "Combien font : <b>$calcul</b><br />";

if($lesigne == '/')
{
	$resultat = $nombre1/$nombre2;
	echo "Arrondissez à l'entier défaut.<br />";
	echo "<u>Exemple</u><br /> Pour (0 <= x <= 4), 12.x donnera 12<br />Pour (5 <= x <= 9), 12.x donnera 13<br /><br />";
}
else
	if($lesigne == '*')
		$resultat = $nombre1*$nombre2;
	else
		if($lesigne == '+')
			$resultat = $nombre1+$nombre2;
		else
			$resultat = $nombre1-$nombre2;

$_SESSION['resultatcaptcha2'] = round($resultat); //arrondi à l'entier par défaut.
?>

<form method="post" action="verificationcaptcha2.php">
	Votre réponse : <input type="text" name="reponsecaptcha2" value="" />
	<input type="submit" value="Valider" />
</form>




</body>

</html>

 Conclusion

Je n'ai pas réussi à faire afficher la réponse du calcul en mettant directement la variable du signe ($lesigne) dans la chaîne de calcul ($resultat).
C'est pourquoi j'ai fais des conditions... Si quelqu'un à la solution pour éviter de faire ses conditions, ça serait sympa qu'il m'en fasse part ^^

Voilà, j'attends vos remarques.

 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

30 avril 2007 06:37:42 :
Ajout de 2 explications sur ma source ( substr, round )

 Sources du même auteur

Source avec Zip Source avec une capture CAPTCHA ( ANTI-SPAM, ANTI-ROBOT )

 Sources de la même categorie

Source avec Zip Source avec une capture CAPTCHA AJAX ANTI-BOT par darkvador59
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
PROTÉGEZ VOS LIENS DE TÉLÉCHARGEMENT PAR MOT DE PASSE ET/OU ... par unlien

 Sources en rapport avec celle ci

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 CAPTCHA VISUELLE par kankrelune
Source avec Zip CAPTCHA NON VISUELLE par kankrelune
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 neigedhiver le 30/04/2007 13:34:09

Salut,

Plutôt qu'un if... Un switch serait pas mal... C'est un peu mieux optimisé pour ce genre de test.

Une autre méthode serait d'utiliser une fonction par opération à effectuer et de l'appeler dynamiquement en fonction du signe obtenu aléatoirement.

Par ailleurs, la fonction mt_rand est plus efficace que rand : http://ch2.php.net/manual/fr/function.mt-rand.php

Peut-être que l'utilisation de floor() à la place de round() simplifierait les explications du formulaire.

Et parce que j'aime bien avoir un code html propre, un petit \n pour chaque retour à la ligne, après <br />, ça fait plus classe (mais c'est vraiment pour chipoter).

Dernier commentaire, qui n'est pas spécifique à cette source : je suis toujours étonné de voir le nombre de personnes qui continuent de développer en mélangeant allègrement php et html. En ce qui me concerne, j'ai du mal : c'est moins portable, moins clair pour une intégration dans un autre site web. Sans aller jusqu'à l'utilisation d'un moteur de templates comme Smarty, il est possible de séparer le traitement de l'affichage, même en utilisant des echo().

Commentaire de kankrelune le 30/04/2007 14:03:48

"Plutôt qu'un if... Un switch serait pas mal... C'est un peu mieux optimisé pour ce genre de test."

Si le switch est effectivement plus clair la suite d'if/elseif/else reste plus rapide à l'execution... .. .

@ tchaOo°

Commentaire de neigedhiver le 30/04/2007 14:50:38

J'étais persuadé du contraire, je viens de constater que non...
Cependant, switch est moins performant qu'une syntaxe comme la suivante :
if () {}
elseif () {}
else () {}

Or ce n'est pas la syntaxe que WanaDien utilise.

Commentaire de kankrelune le 30/04/2007 14:53:29

Au fait tes if/elseif/eles pour le calcul sont un peu bof bof... d'une manière générale tu te complique la vie (initialisation de variables pour rien, le substr pour un caractère...) sinon tout comme neigedhiver tu devrais faire une fonction qui renvoie la question point... moi je ferais plutot... .. .

/** je poste parce que ça me saoul de tout réécrire en commentaire **/

>> http://www.phpcs.com/code.aspx?ID=42513

@ tchaOo°

Commentaire de kankrelune le 30/04/2007 14:54:54

@ neigedhiver... par contre il est indéniable qu'un switch bien indenté est bien plus clair à lire... .. . ;o)

@ tchaOo°

Commentaire de WanaDien le 30/04/2007 15:24:49

Merci pour vos commentaires.

@Neigedhiver : Ok donc en fait le rand() est devenu obsolète en quelque sorte ?
Pour le floor() j'y avais pensé, mais j'ai choisi round() pour avoir un "niveau de difficulté" en plus. ^^
Personnellement, dans mes codes, je ferme et ouvre à chaque fois la balise php quand j'en ai besoin, c'est très rare que je fasse un truc de se genre : echo "<div>Oh ok $var</div>";, je préfère faire <div>Oh ok <?php echo $var; ?></div> (mais bon là je l'ai pas fais, me demande pas pourquoi. lol) enfin après c'est chacun sa façon de coder lol

@kankrelune : tu me conseilles quoi alors ? je privilègie la vitesse par rapport à mes conditions, ou l'esthétique avec le switch ?

Bonne jounrée, je mettrais ma source à jour entre 2 insommies ^^

Commentaire de kankrelune le 30/04/2007 15:41:38

le rand() n'est pas obsolète... il est juste plus lent que mt_rand()

Quand au switch vu la taille du code que tu utilise l'un ou l'autre la différence sera imperceptible au niveau du temps d'exécution... sur un gros code ça vaut le coup de se pencher sur la question mais sur un code court comme le tien tu peux mettre un switch c'est pas bien grave... privilégie celui qui te parait le plus clair et avec lequel tu est le plus à l'aise... mais comme je l'ai dit que ça soit un switch ou un if/elseif/else ce n'est pas le mieux en terme de logique... vas voir le code que j'ai posté (lien dans mon commentaire précédant)... .. .

@ tchaOo°

Commentaire de WanaDien le 30/04/2007 15:51:29

@kankrelune : Okai :) merci ^^. Ouais j'ai vu ton code, en fait tu utilises la fonction eval() qui permettre d'afficher ton signe dans une variable et faire le calcul.

Commentaire de neigedhiver le 30/04/2007 15:57:37

Concernant le mélange php html, c'est pas ce que je voulais dire.
Dans les deux cas que tu cites, c'est un mélange php et html.
C'est une syntaxe qui ne me plait pas, parce que j'ai tendance à séparer le traitement de l'affichage, afin qu'un éventuel designer puisse ne s'occuper que de l'affichage, sans savoir comment est déterminé tout ce qui est affiché.
Sans gestionnaire de template comme Smarty, ça donnerait des variables définies tout au long du script, puis placées, en fin de script, dans le code html. Là, peu importe qu'on utilise echo() pour afficher tout le code html dans lequel on place les variables (ce qui est beurk) ou qu'on ouvre des tags php chaque fois qu'on veut afficher une variable (comme les templates compilés de Smarty).
Après, personnellement, j'utilise toujours Smarty. Bref, comme tu le dis, chacun sa façon de coder. Mais tout dépend aussi de ce qu'on veut faire : si tu veux fournir une source qui puisse être facilement adaptée et intégrée dans un site web par le premier venu, plus tu lui facilites la tâche, plus ça plaira...

Sinon, pour ne plus avoir de test, tu peux utiliser des fonctions appelées dynamiquement, comme je te le disais. Une pour chaque opération.
Exemple :

function operation_add($n1, $n2)
{
return ($n1 + $n2);
}

function operation_sous($n1, $n2)
{
return ($n1 - $n2);
}

function operation_mult($n1, $n2)
{
return ($n1 * $n2);
}

function operation_div($n1, $n2)
{
echo "Arrondissez à l'entier défaut.<br />";
echo "<u>Exemple</u><br /> Pour (0 <= x <= 4), 12.x donnera 12<br />Pour (5 <= x <= 9), 12.x donnera 13<br /><br />";
return round($n1/$n2);
}

$operations = array(
0 => array(
'func' => 'add',
'signe' => '+'),
1 => array(
'func' => 'sous',
'signe' => '-'),
2 => array(
'func' => 'mult',
'signe' => '*'),
3 => array(
'func' => 'div',
'signe' => '/')
);

$nombre1 = rand(100,200);
$nombre2 = rand(1,100);
$num_op = rand(0,3);
$lesigne = $operations[$num_op]['signe'];
$lafonction = 'operation_' . $operations[$num_op]['func'];
$resultat = $fonction($nombre1, $nombre2);

Et là, pouf, plus aucun test.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

calcul d'une durée [ par noneed4anick ] j'ai deux colonnes ds un base MySQL au format datetime ( 2002-01-15 15:57:32 )comment faire pour calculer la durée qu'il s'est écoulé entre les deux, Sécurité [ par thebigbang ] Bonjout,Je suis webmaster et je voudrais sécurisé, enfin c'est une facon de parler, un peu plus mon site ...il conmporte un dossier "admin" et lorsque calcul de l'age [ par Maheu ] Salut à tous!!Je suis newby en PhP et voudrai calculer un age a partir de deux dates (la date courante date() et une date de naissance au format dd-mm Calcul ecart entre 2 heures [ par must ] Salut,voila ce que je cherche,mais trouve pas,alors si vous pouviez m'aiderJe fix une geure limite,dison:20 heures,30, minutes,20 secondesQuand on vie Calcul [ par cyrilnd01 ] Bonjour @tous,Voila sa fait déja une semaines que je cherche comment je pourrait faire pour calculer un trucs, et je n'arrive pasJe vais vous expliqué probleme de stockage et calcul d'agregat [ par ludlu ] salut au lecteur de ce message,je voudrai pouvoir realiser ceci :J'ai a calculé un agregat a partir de resultats de plusieurs requetes qui retourneron calcul de l'espace utilisé sur le serveur [ par jaketstream ] salutvoilà, j'ai deux questions :1. j'ai mis en place un script qui permet de scruter l'ensemble des dossiers et de donner leur taille, puis à la fin quand on parle sécurité [ par Tomcube ] Oui, nous ne vivons pas dans un monde sans criminels !! ^^ (me prenez pas pour un débile lol) Et sur internet les criminels c les hackers. Donc pour l Sécurité-fichiers-dossiers [ par stageSAP ] Bonjour,Pour mon site, je protège l'accès aux pages grâce aux variables de sessions et cela marche très bien. Je travaille en local pour l'instant. Su Sécurité pour un script de commentaires !!! et droits d'auteur?? [ par perig ] BonjourJe suis désolé, je n'ai pas fini de vous embêter avec mes questions !!!! Voilà la question du jour :J'ai crée un script qui pe


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



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

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