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

Web Perl Discussion :

[PERL]Problème sur la gestion des sessions


Sujet :

Web Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 35
    Points : 25
    Points
    25
    Par défaut [PERL]Problème sur la gestion des sessions
    Bonjour tout le monde,

    Je dois gérer des sessions en perl.
    Après avoir rempli un formulaire d'authentification dans le fichier index.pl, une session se crée.

    Cette étape marche parfaitement bien.
    En revanche dès que je fais une action et que je veux récupérer les données de ma session, je n'y arrive pas. Je récupère un autre id.

    Voici mon code.

    Le formulaire :
    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
     
    #!/usr/bin/perl -w
    use CGI::Carp qw(fatalsToBrowser);
    use strict;
     
    #Affichage de la page web
    #------------------------
     
    print "Content-type: text/html\n\n";
    print <<'EOT';
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html>
       <head>
            <title>Test Vmware</title>
       </head>
       <body>
            Accueil Vmware !
            <form action="vm_view.pl" method="post">
                    <input type="hidden" Name="type" Value="Authentication" >
                    Username: <input type="text" Name="username" Value="" > <br>
                    Password: <input type="password" Name="password" Value="" > <br>
                    <input type="submit" Name "Submit" Value="Sign">
            </form>
       </body>
    </html>
    EOT
    Et voici le fichier appelé vm_view.pl :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    #!/usr/bin/perl
    use lib qw{ blib/lib blib/auto blib/arch blib/arch/auto/VMware blib/arch/auto };
    use strict;
    use CGI;
    use CGI::Carp qw(fatalsToBrowser);
    use CGI::Session;
    use VMware::Vix::Simple;
    use VMware::Vix::API::Constants;
    #use VMware::Vix::Vm_Action;
    require "vm_action.pl";
     
    #Authentication
    my $buffer;
    if ($ENV{'REQUEST_METHOD'} eq "POST" ) {
            read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
    }
    else {
            $buffer = $ENV{'QUERY_STRING'};
    }
     
    #Treatment and cutting
    my @pairs;
    my $pair;
    my $name;
    my $value;
    my %FORM;
    @pairs = split(/&/, $buffer);
    foreach $pair (@pairs) {
            ($name, $value) = split(/=/, $pair);
            $value =~ tr/+/ /;
            $value =~ s/%(..)/pack("C", hex($1))/eg;
            $FORM{$name} = $value;
    }
     
    #Variable declaration
    my $url = "https://test:8333/sdk";
    my $err = VIX_OK;
    my $hostHandle = VIX_INVALID_HANDLE;
    my $vmHandle = VIX_INVALID_HANDLE;
    my $hostname_printable = `hostname`; chomp($hostname_printable);
    my @listVMs = ();
     
    #HTML header
    print "Content-type: text/html\n\n";
    print <<'EOT';
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html>
            <head>
                    <title>Test Vmware</title>
            </head>
            <body>
    EOT
     
    # Get the CGI form data
    my $cgi = new CGI;
     
    #Connection
    if ($FORM{'type'} eq "Authentication"){
            my $username = $FORM{'username'};
            my $password = $FORM{'password'};
            ($err,$hostHandle)= Connection($url,$username,$password);
             if ($err == VIX_OK){
                    print "<p><b>Welcome ".$username."</b></p>";
            }
            else {
                    print "<b>Connection failed :</b><br>Error ".$err.", ".GetErrorText($err);
                    exit();
            }
            #die "Connection failed, $err ", GetErrorText($err), "\n" if $err != VIX_OK;
     
            #Start session
            my $session = new CGI::Session("driver:File", $cgi, {Directory=>"C:/Temp"}) or die CGI::Session->errstr;
            #my $session = new CGI::Session() or die CGI::Session->errstr;
            my $cookie = $session->cookie( -name   => $session->name,
                                          -value  => $session->id );
            #print $session->header( -cookie=>$cookie );
            print $cookie;
            #print $session->header;
     
            $session->param('username', $username);
            $session->param('password', $password);
            $session->param('handle', $hostHandle);
            print $session->param('username');
            print $session->param('password');
            print $session->param('handle');
    }
    else {
            my $sid = $cgi->cookie("CGISESSID") || undef;
            my $session    = new CGI::Session($sid);
            $hostHandle=$session->param('handle');
     
            print $session->header;
            #print $session->param('username');
            #print $session->param('password');
            #print $session->param('handle');
    }
    Je vous épargne la fin du fichier.
    Est-ce que vous voyez le problème au niveau de la gestion des sessions ?

    Le code me semble bon d'apres ce que j'ai vu sur Internet.

    Merci d'avance si vous pouvez m'aider.

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 164
    Points : 218
    Points
    218
    Par défaut
    J'espère avoir compris le problème.
    Voici le minimum pour récupérer les données (le fichier vm_view.pl):
    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
    #!/perl/bin/perl -wT
    use strict ;
    use CGI qw(:standard) ; 
    use CGI::Carp qw(warningsToBrowser fatalsToBrowser) ;
    my($type,$username,$password)=(param('type'),param('username'),param('password')) ;
    print "Content-type: text/html\n\n";
    print <<EOF
    <html>
    <head> Test</head>
    <body>
    type=$type <br />
    username=$username <br />
    pasword=$password  <br />
    </body>
    </html>
    EOF
    Sur mon ordinateur, ça marche. Comme je suis sous windows, il faut changer la première ligne. D'autre part j'ai nommé ce fichier vm_view.cgi car mon serveur n'est pas configuré pour lancer des fichiers pl.
    use CGI qw(:standard) ;
    permet d'utiliser CGI.pm de manière classique sans programmation orientée objet, ce qui est suffisant pour récupérer les données d'une form
    La ligne :
    use CGI::Carp qw(warningsToBrowser fatalsToBrowser) ;
    doit être supprimée quand tout est au point, avant de mettre le fichier sur le serveur car cela pourrait aider un hacker mal intentionné.
    Les lignes que j'ai placées entre <body> et </body> sont là juste pour vérifier que le script a bien récupéré les données.
    En espérant que ça aide, cordialement,
    Nibroc

    Citation Envoyé par LostRailler Voir le message
    Bonjour tout le monde,

    Et voici le fichier appelé vm_view.pl :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    #!/usr/bin/perl
    use lib qw{ blib/lib blib/auto blib/arch blib/arch/auto/VMware blib/arch/auto };
    use strict;
    use CGI;
    use CGI::Carp qw(fatalsToBrowser);
    use CGI::Session;
    use VMware::Vix::Simple;
    use VMware::Vix::API::Constants;
    #use VMware::Vix::Vm_Action;
    require "vm_action.pl";
     
    #Authentication
    my $buffer;
    if ($ENV{'REQUEST_METHOD'} eq "POST" ) {
            read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
    }
    else {
            $buffer = $ENV{'QUERY_STRING'};
    }
     
    #Treatment and cutting
    my @pairs;
    my $pair;
    my $name;
    my $value;
    my %FORM;
    @pairs = split(/&/, $buffer);
    foreach $pair (@pairs) {
            ($name, $value) = split(/=/, $pair);
            $value =~ tr/+/ /;
            $value =~ s/%(..)/pack("C", hex($1))/eg;
            $FORM{$name} = $value;
    }
     
    #Variable declaration
    my $url = "https://test:8333/sdk";
    my $err = VIX_OK;
    my $hostHandle = VIX_INVALID_HANDLE;
    my $vmHandle = VIX_INVALID_HANDLE;
    my $hostname_printable = `hostname`; chomp($hostname_printable);
    my @listVMs = ();
     
    #HTML header
    print "Content-type: text/html\n\n";
    print <<'EOT';
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html>
            <head>
                    <title>Test Vmware</title>
            </head>
            <body>
    EOT
     
    # Get the CGI form data
    my $cgi = new CGI;
     
    #Connection
    if ($FORM{'type'} eq "Authentication"){
            my $username = $FORM{'username'};
            my $password = $FORM{'password'};
            ($err,$hostHandle)= Connection($url,$username,$password);
             if ($err == VIX_OK){
                    print "<p><b>Welcome ".$username."</b></p>";
            }
            else {
                    print "<b>Connection failed :</b><br>Error ".$err.", ".GetErrorText($err);
                    exit();
            }
            #die "Connection failed, $err ", GetErrorText($err), "\n" if $err != VIX_OK;
     
            #Start session
            my $session = new CGI::Session("driver:File", $cgi, {Directory=>"C:/Temp"}) or die CGI::Session->errstr;
            #my $session = new CGI::Session() or die CGI::Session->errstr;
            my $cookie = $session->cookie( -name   => $session->name,
                                          -value  => $session->id );
            #print $session->header( -cookie=>$cookie );
            print $cookie;
            #print $session->header;
     
            $session->param('username', $username);
            $session->param('password', $password);
            $session->param('handle', $hostHandle);
            print $session->param('username');
            print $session->param('password');
            print $session->param('handle');
    }
    else {
            my $sid = $cgi->cookie("CGISESSID") || undef;
            my $session    = new CGI::Session($sid);
            $hostHandle=$session->param('handle');
     
            print $session->header;
            #print $session->param('username');
            #print $session->param('password');
            #print $session->param('handle');
    }
    Je vous épargne la fin du fichier.
    Est-ce que vous voyez le problème au niveau de la gestion des sessions ?

    Le code me semble bon d'apres ce que j'ai vu sur Internet.

    Merci d'avance si vous pouvez m'aider.

  3. #3
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    Salut !

    Dans ton script je ne vois comment tu passes l'info d'un appel à l'autre de ta page, et à mon avis c'est parce que tu ne passes pas ton cookie dans ton header, comme indiqué dans la doc.

    Soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print header(-cookie=>$my_cookie);
    au moment d'afficher ta page, et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @cookies = cookie();
    au moment de récupérer les infos de ta session, qui doivent ensuite repasser dans ton header pour le prochain appel.

    Ca te donnerait donc plutot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    if ($auth) {
    #creation du cookie
    }
    else {
    #récuperation d'un cookie existant
    my @cookies = cookie();
    }
    #
    #
    #écriture de la page web avec :
    print header(-cookie=>$my_cookie);
    #pour faire suivre le cookie le temps qu'il est censé vivre
    #
    #
    @+
    Mr6

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 164
    Points : 218
    Points
    218
    Par défaut
    Bonjour,
    Je ne m'occupe pas de cookie, d'ailleurs je n'en ai pas vu, c'est la fonction param qui est définie dans le module CGI.pm qui fait tout le travail (y compris le décodage si nécessaire)
    As-tu essayé de faire tourner mon script ? (en changeant la première ligne).
    à plus
    Nibroc

    Citation Envoyé par Mr6 Voir le message
    Salut !

    Dans ton script je ne vois comment tu passes l'info d'un appel à l'autre de ta page, et à mon avis c'est parce que tu ne passes pas ton cookie dans ton header, comme indiqué dans la doc.

    Soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print header(-cookie=>$my_cookie);
    au moment d'afficher ta page, et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @cookies = cookie();
    au moment de récupérer les infos de ta session, qui doivent ensuite repasser dans ton header pour le prochain appel.

    Ca te donnerait donc plutot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    if ($auth) {
    #creation du cookie
    }
    else {
    #récuperation d'un cookie existant
    my @cookies = cookie();
    }
    #
    #
    #écriture de la page web avec :
    print header(-cookie=>$my_cookie);
    #pour faire suivre le cookie le temps qu'il est censé vivre
    #
    #
    @+
    Mr6

  5. #5
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    Arf, désolé nibroc, c'etait pour répondre à Lost à l'origine.
    Son souci est le suivi de la session une fois le cookie créé dans le code qu'il a indiqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    [...]
    my $session = new CGI::Session("driver:File", $cgi, {Directory=>"C:/Temp"}) or die CGI::Session->errstr;
            #my $session = new CGI::Session() or die CGI::Session->errstr;
            my $cookie = $session->cookie( -name   => $session->name,
                                          -value  => $session->id );
            #print $session->header( -cookie=>$cookie );
            print $cookie;
    [...]
    Pour faire un peu plus complet, le code devrait être le suivant :
    le header de la page a-t-il un cookie ?
    si oui je le récupère, éventuellement j'en vérifie le contenu, puis je le remets dans le header pour qu'il retourne dans le circuit de la session
    la page est-elle celle d'authentification ?
    si oui je crée le cookie et je le mets dans le header
    enfin je crée ma page web, avec ou sans le cookie.

    @+
    Mr6

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 164
    Points : 218
    Points
    218
    Par défaut
    D'accord, Dans ce cas c'est moi qui ai mal compris, je pensais que le seul problème
    était de récupérer les données (name, username et password) de la FORM. Je n'avais pas vu le cookie.
    Cordialement,
    Nibroc

    Citation Envoyé par Mr6 Voir le message
    Arf, désolé nibroc, c'etait pour répondre à Lost à l'origine.
    Son souci est le suivi de la session une fois le cookie créé dans le code qu'il a indiqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    [...]
    my $session = new CGI::Session("driver:File", $cgi, {Directory=>"C:/Temp"}) or die CGI::Session->errstr;
            #my $session = new CGI::Session() or die CGI::Session->errstr;
            my $cookie = $session->cookie( -name   => $session->name,
                                          -value  => $session->id );
            #print $session->header( -cookie=>$cookie );
            print $cookie;
    [...]
    Pour faire un peu plus complet, le code devrait être le suivant :
    le header de la page a-t-il un cookie ?
    si oui je le récupère, éventuellement j'en vérifie le contenu, puis je le remets dans le header pour qu'il retourne dans le circuit de la session
    la page est-elle celle d'authentification ?
    si oui je crée le cookie et je le mets dans le header
    enfin je crée ma page web, avec ou sans le cookie.

    @+
    Mr6

Discussions similaires

  1. Problème sur la gestion des droits des dossiers
    Par PAYASS59 dans le forum Administration-Migration
    Réponses: 3
    Dernier message: 25/11/2013, 15h40
  2. Problème sur une gestion des exceptions
    Par d0n32 dans le forum Langage
    Réponses: 3
    Dernier message: 10/12/2012, 17h12
  3. Problème sur la gestion des utilisateurs
    Par bambi98 dans le forum Administration
    Réponses: 4
    Dernier message: 16/04/2008, 14h24
  4. Problème sur la gestion des erreurs
    Par ronio dans le forum Langage
    Réponses: 4
    Dernier message: 08/11/2006, 09h47

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