IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Création d'un captcha en perl


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut Création d'un captcha en perl
    Bonjour

    J'utilise actuellement sur un de mes sites un captcha en php qui calcule la somme de deux nombres générés aléatoirement.

    J'ai décidé de le réécrire en perl.

    Voici les trois premières étapes:
    • Stocker des nombres dans un tableau
    • Extraire deux nombres aléatoire du tableau
    • Calcul de la somme des deux nombres

    Voici le code en perl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    #!/usr/bin/perl -w
     
    # Don't forget chmod 755
     
    use strict;                               
    use warnings;                           
    use CGI qw(:standard);      
    use CGI::Carp qw(warningsToBrowser fatalsToBrowser);  routine
     
    # Security
    $CGI::POST_MAX=1024*100;   # Max 100K posts
    $CGI::DISABLE_UPLOADS=1;   # No upload
     
    # Creating a new CGI object
    my $cgi=new CGI;
     
    &show_captcha;
     
    sub show_captcha {
     
    # Table of values
    my @table=(2, 35, 15, 6, 40, 4, 8, 22, 11, 5, 32, 10, 1, 12, 26);
     
    # Random extraction of two values of the table
    my @rand_keys=rand @table[2];
     
    # Question and sum of the two values
    my $question='Please enter the result of the sum '.@table[@rand_keys[0]]. ' + '.@table[@rand_keys[1]].' (to avoid spam) = ';
     
    print $cgi->header,              
          $question;
          $cgi->end_html;
    En php, pour extraire aléatoirement deux nombres, je l'écris de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $rand_keys = array_rand($table, 2);
    Mais en perl, c'est un autre problème. En effet, lorsque je rafraîchis la page, uniquement le premier nombre est généré, le second est toujours égal à 2

    Qu'en pensez-vous ?

    Merci

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Que rand ne renvoie jamais qu'une seule valeur... Il est donc normal que @rand_keys n'en contienne qu'une (et donc quand tu demandes la deuxième, elle est undef, soit 0 en numérique...). Je te renvoie à la doc de rand() visiblement tu te méprends sur son utilisation.

    Par ailleurs, je ne comprend pas très bien pourquoi tu utilises un tableau de valeur ? Deux nombres tirés aléatoirements en-dessous de 50 suffirait bien non ?

    Tu utilises "@" là où tu devrais utiliser "$", ce n'est vraiment pas une bonne idée...

    L'idiome pour récupérer un nombre au hasard dans un tableau @table, c'est :
    tout simplement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    print $cgi->header,              
          $question;
          $cgi->end_html;
    Tu devrais mettre une "," après $question, pas un ";". Est-ce que tu essaie de compiler tes programmes avant de les essayer ? Ca te pointerait déjà pas mal d'erreurs, surtout avec strict et warnings.

    --
    Jedaï

  3. #3
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut
    Bon j'ai avancé un peu

    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #!/usr/bin/perl
     
    print "Content-type: text/plain\n\n";
     
    # Value (digits 1 to 100)
    @array = (1..100);
     
    # Random
    srand;
     
    # Use only 2 digits
    foreach (1..2)
    {
          $rand = int(rand scalar(@array));
     
          # Digit 1
          $n1=$array[$rand];
     
          # Digit 2
          $n2=splice(@array,$rand,1);
    }
     
    # Somme of two value
    print 'Please enter the result of the sum '.$n1.' + '.$n2.' (to avoid spam) =';
    A l'exécution, j'obtiens l'affichage suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Please enter the result of the sum 73 + 73 (to avoid spam) =
    Lorsque je rafraîchis la page, le deuxième nombre reste identique

  4. #4
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut
    ça va un peu mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #!/usr/bin/perl
     
    print "Content-type: text/plain\n\n";
     
    # Value (digits 1 to 100)
    @array = (1..100);
     
    # Random
    srand;
     
    # Use only 2 digits
    foreach (1..2)
    {
    	$rand = int(rand scalar(@array));
     
    	# Digit 1
    	$n1=$array[$rand];
     
    	# Digit 2
            $n2=splice(@array,$rand,1);
    }
     
    # Somme of two value
    print 'Please enter the result of the sum '.$n1.' + '.$n2.' (to avoid spam) = ';
    Il arrive à me sortir une addition 0 + 0

  5. #5
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Tu m'explique ce qui ne te plait pas avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print 'Please enter the result of the sum '. int(rand 99)+1.' + '.int(rand 99)+1.' (to avoid spam) = ';
    ??
    --
    Jedaï

  6. #6
    Membre chevronné
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Par défaut
    Tu n'as toujours pas répondu à la question de Jedai : pourquoi utiliser un tableau ? (ça m'intrigue aussi)
    Pourquoi utiliser $n1=$array[$rand]; plutôt que, par exemple, $n1=int(rand 100) +1; ?
    Et j'espère que tu te rends compte que ta boucle ne sert strictement à rien sinon à t'assurer que les deux nombres (au fait, "nombre" en anglais c'est "number", pas "digit", qui veut dire "chiffre") seront identiques à l'arrivée.

    Je crois comprendre ce que tu as essayé de faire avec ta boucle, ton tableau et splice : t'assurer que les deux nombres sont différents, c'est ça ? Si c'est le cas c'est raté.
    Je ne vois pas très bien en quoi c'est utile pour ton captcha, mais si tu y tiens, il y a d'autres solutions, bien plus simples.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $n1=int(rand 100)+1;
    my $n2=($n1 + int(rand 99))%100+1;
    Moui, bon, d'accord, pas forcément super-super-simple, mais quand même moins alambiqué que ta solution. Et puis, surtout, ça marche. Note au passage les my. Jedai doit être fatigué de le répéter tout le temps, alors je le fais à sa place : utilise le pragma strict !

    Edit : encore doublé.

    Jedai : en même temps, avec ta ligne, on ne conserve pas les termes de l'addition, donc c'est pas évident pour contrôler si elle est juste. Dure journée ?

  7. #7
    Membre expérimenté

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Par défaut
    J'ai souhaité utiliser un tableau car le captcha en php que j'utilisais sur mon ancien site utilisait un tableau.

    J'essaye aujourd'hui de réaliser le même script mais en perl.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme de création d'un captcha
    Par pi-2r dans le forum Langage
    Réponses: 7
    Dernier message: 09/11/2009, 17h30
  2. [Système] Appel script perl, pas de création de fichier
    Par trollanfer dans le forum Langage
    Réponses: 2
    Dernier message: 11/12/2008, 22h08
  3. Experience de captcha en perl
    Par Danyel dans le forum Langage
    Réponses: 0
    Dernier message: 24/05/2008, 22h57
  4. Création Exception Perl
    Par alex436331 dans le forum Langage
    Réponses: 7
    Dernier message: 27/06/2007, 16h18
  5. Réponses: 4
    Dernier message: 29/04/2007, 18h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo