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

Autres langages pour le Web Discussion :

[CGI] durée de validité de HTTP_AUTHORIZATION


Sujet :

Autres langages pour le Web

  1. #1
    Membre confirmé
    Avatar de didier.cabale
    Homme Profil pro
    Conseil - Consultant en systèmes d’information
    Inscrit en
    Août 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d’information
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 130
    Points : 522
    Points
    522
    Par défaut [CGI] durée de validité de HTTP_AUTHORIZATION
    [CGI]
    Bonjour,
    J'ai un prog CGI qui ouvre sur le navigateur client une fenetre d'authentification basique. Une fois que le client s'est logué avec succès à partir de cette fenêtre, la fenêtre d'authentification basique ne s'ouvre plus (tant que le navigateur reste ouvert), s'il redemande l'accès à cette page. Je suppose que c'est parce-que les paramètres d'authentification ont dû être sauvés en cache chez le client.
    Ma question est: comment maîtriser la durée de vie de la variable HTTP_AUTHORIZATION, de façon à forcer le client à re-saisir ses paramètres d'authentification basique à chaque entrée sur la page?
    Nb: l'en-tete HTTP 'Cache-Control: No-cache' ne semble pas fonctionner
    Merci

  2. #2
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    La durée de vie de l'authentification http est... nulle.
    Comment ça se passe lorsque le navigateur tombe sur une page protéger par une telle identification ?

    1) Le navigateur effectue une requête http standard
    2) Le serveur revoi l'entête WWW-Authenticate: Basic realm="truc machin" et le statut 401 (ainsi qu'une page d'erreur).
    3) Le navigateur remande à l'utilisateur l'entrer un couple login/password, puis réitère la requête http avec en plus l'entête Authorization: Basic login:pass (login:pass étant encodé en base64)
    4) Si le login/mdp sont bons, le serveur renvoi un statut 200 et la page demandé, sinon, re WWW-Authenticate et re 401.

    Tu remarquera qu'il n'a été évoqué à aucun moment la conservation des informations. Et c'est normal : pour chaque page le navigateur renvoi le couple login/mdp, ce qui garanti une meilleur sécurité.

    Je pense que si tu veux provoquer la réidentification il doit suffit de renvoyer l'en-tête WWW-Authenticate. Mais fais attention à ne pas l'envoyer à chaque fois qu'on demande ta page. :p
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  3. #3
    Membre confirmé
    Avatar de didier.cabale
    Homme Profil pro
    Conseil - Consultant en systèmes d’information
    Inscrit en
    Août 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d’information
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 130
    Points : 522
    Points
    522
    Par défaut
    Tu remarquera qu'il n'a été évoqué à aucun moment la conservation des informations. Et c'est normal : pour chaque page le navigateur renvoi le couple login/mdp, ce qui garanti une meilleur sécurité.
    Dans mon CGI, l'envoi de l'entete WWW-Authenticate est conditionné par un booléen qui se résume à "if GetEnvironmentVariable('HTTP_AUTHORIZATION', Buff, SizeOf(Buff)) = 0 then result := false;". Donc si le result = false -> envoi de l'entete WWW-Authenticate.
    Or sur la 1ère requête utilisateur, GetEnvironmentVariable('HTTP_AUTHORIZATION', Buff, SizeOf(Buff)) = 0, ce qui provoque l'envoi de l'entete WWW-Authenticate -> Ok. Mais sur les requêtes suivantes, je suppose que GetEnvironmentVariable('HTTP_AUTHORIZATION', Buff, SizeOf(Buff)) > 0, ce qui ne m'envoie plus l'entete WWW-Authenticate.
    Donc je suppose que la variable d'environnement 'HTTP_AUTHORIZATION' a bien une durée de vie.
    Me comprends-tu mieux?
    Didier

  4. #4
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Oui je comprends bien, mais si lors des requêtes suivantes ta variable 'HTTP_AUTHORIZATION' est définie, c'est parceque le navigateur à renvoyé automatiquement le couple login/mdp sans que le serveur ait eut à le demander.
    La variable 'HTTP_AUTHORIZATION' n'a aucune durée de vie : ceci serait une faille potentielle dans le système d'identfication http (qui jusqu'à présent n'a révélé aucune faille).

    Si tu veux vraiment forcer l'utilisateur à renvoyer son login/mdp, il faut forcer le serveur à renvoyer l'entête WWW-Authenticate, ou alors l'envoyer "manuellement".
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  5. #5
    Membre confirmé
    Avatar de didier.cabale
    Homme Profil pro
    Conseil - Consultant en systèmes d’information
    Inscrit en
    Août 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d’information
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 130
    Points : 522
    Points
    522
    Par défaut
    Oui je comprends bien, mais si lors des requêtes suivantes ta variable 'HTTP_AUTHORIZATION' est définie, c'est parceque le navigateur à renvoyé automatiquement le couple login/mdp sans que le serveur ait eut à le demander.
    Donc la variable 'HTTP_AUTHORIZATION' (ou le couple login/mdp) a bien une durée de vie sur le navigateur, puisque le navigateur renvoie automatiquement le couple login/mdp, lors des prochaines authentification. Non?
    Didier

  6. #6
    Membre confirmé
    Avatar de didier.cabale
    Homme Profil pro
    Conseil - Consultant en systèmes d’information
    Inscrit en
    Août 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d’information
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 130
    Points : 522
    Points
    522
    Par défaut
    En fait, je pense que mon besoin est impossible à résoudre simplement -> cf http://www.caucho.com/support/resin-interest/0306/0120.html

    Merci pour votre aide

  7. #7
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    si tu renvoi l'entête WWW-Authenticate le navigateur sera obligé de redemander l'identification.
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  8. #8
    Membre confirmé
    Avatar de didier.cabale
    Homme Profil pro
    Conseil - Consultant en systèmes d’information
    Inscrit en
    Août 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d’information
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 130
    Points : 522
    Points
    522
    Par défaut
    si tu renvoi l'entête WWW-Authenticate le navigateur sera obligé de redemander l'identification.
    Le pb est que, dans mon cgi, le renvoi de www-authenticate est conditionné par une fonction booléenne qui renvoie toujours 'true' dès que le navigateur client a réussi à s'authentifier. (cf mon 2ème message)
    Me suivez-vous?

  9. #9
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Ne pourrais-tu pas renvoyer quand même cette en-tête ? peut-être des données ont-elles déjà été envoyés au navigateur, ce qui empêcherais de renvoyer une quelconque en-tête.

    quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    inclusion du fichier qui gère l'entête WWW-Authenticate
    si [conditions] alors renvoyer quand même l'entête WWW-Authenticate
    ...
    suite de la CGI
    Dis moi, en quel langage est ta CGI ?
    SI tu n'a aucun moyen de renvoyer manuellement une en-tête dans le corps de ta CGI, alors ton problème n'a pas de solution. À part peut-être modifier ta fonction booleenne qui conditionne l'envoi de l'en-tête WWW-Authenticate.
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  10. #10
    Membre confirmé
    Avatar de didier.cabale
    Homme Profil pro
    Conseil - Consultant en systèmes d’information
    Inscrit en
    Août 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d’information
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 130
    Points : 522
    Points
    522
    Par défaut
    Dis moi, en quel langage est ta CGI ?
    Delphi
    SI tu n'a aucun moyen de renvoyer manuellement une en-tête dans le corps de ta CGI, alors ton problème n'a pas de solution
    Mais je peux renvoyer manuellement l'en-tête.
    Pour plus de clarté, voici le source de mon CGI:

    ** début procedure principale **
    procedure Main
    begin
    if (not Authorized) then begin

    WriteLn('HTTP/1.1 401 Unauthorized');
    WriteLn('Content-type: text/html');
    WriteLn('WWW-Authenticate: Basic realm="BCRx"');
    WriteLn;
    Writeln('<html><head><title>401 Unauthorized</title></head><body>');
    WriteLn('<h1>You need a password to access this page !</h1>');

    end else begin

    WriteLn('HTTP/1.1 200 Welcome !');
    WriteLn('Expires: Thu, 01 Dec 1994 16:00:00 GMT');
    WriteLn('Content-type: text/html');
    Writeln;
    WriteLn(s);

    end;

    WriteLn('</body></html>');
    end.
    ** fin procedure principale **

    ** début function Authorized **
    function Authorized: boolean;
    var
    auth, client_IP: string; // HTTP_AUTHORIZATION
    user_id: string; // username
    pwd : string; // password
    buff: Array[0..50] of char;
    size: byte;
    begin
    // default reply
    Result:=false;

    // *** tout se joue sur cette fonction ***
    if (GetEnvironmentVariable('HTTP_AUTHORIZATION', buff, SizeOf(buff)) = 0) then exit;
    auth := buff;
    auth := copy(auth,pos(' ',auth)+1,length(auth));
    // Decode
    auth := Base64toStr(auth);
    user_id := copy(auth, 1, pos(':',auth)-1);
    if user_id = '' then exit;
    pwd := copy(auth, length(user_id)+2, length(auth));

    Result:=true;
    end;
    ** fin function Authorized **

    Mon pb est que, après une authentification basique client réussie via le formulaire d'authentification basique, GetEnvironmentVariable('HTTP_AUTHORIZATION', buff, SizeOf(buff)) sera toujours > 0, et il n'y aura plus moyen de réinitialiser cette fonction à 0. De ce fait la fonction Authorized retournera toujours 'true', et www-authenticate ne sera jamais renvoyé au navigateur. Le seul moyen, d'après moi, de reprovoquer le renvoi du formulaire d'authentification basique est de fermer le navigateur, de le réouvrir, et de rappeler l'URL.

    Est-ce plus clair?

  11. #11
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Je précise que je ne connais pas du tout le delphi, mais le but est que tu comprenne comment faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ** début procedure principale **
    procedure Main
    begin
    if &#40;&#40;not Authorized&#41; and &#40;not TimeUp&#41;&#41; then begin
    
    WriteLn&#40;'HTTP/1.1 401 Unauthorized'&#41;;
    ...
    ...
    Ensuite tu défini ta fonction TimeUp pour qu'elle renvoi "true" si le temps depuis la dernière identification de cette IP est dépassé, sinon "false".

    Si tu veux vraiment obliger l'utilisateur à ressaisir ses mdp à chaque page c'est un peu plus difficile car en fait le navigateur renvoyant les login/mdp au serveur à chaque requête, il faudrai lui dire "non" une fois sur 2.
    Ceci est faisable par un jeu de cookies.


    Ceci dit je ne vois pas bien l'utilité d'obliger le visiteur à se réidentifier à chaque fois. Mais en même temps je n'ai pas tous les détails du contexte.
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  12. #12
    Membre confirmé
    Avatar de didier.cabale
    Homme Profil pro
    Conseil - Consultant en systèmes d’information
    Inscrit en
    Août 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d’information
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 130
    Points : 522
    Points
    522
    Par défaut
    Ensuite tu défini ta fonction TimeUp pour qu'elle renvoi "true" si le temps depuis la dernière identification de cette IP est dépassé, sinon "false".
    mais je ne veux pas conditionner l'identification à un time-out.

    Si tu veux vraiment obliger l'utilisateur à ressaisir ses mdp à chaque page c'est un peu plus difficile car en fait le navigateur renvoyant les login/mdp au serveur à chaque requête, il faudrai lui dire "non" une fois sur 2.
    Ceci est faisable par un jeu de cookies.
    je ne veux pas utiliser de cookie non plus .. :)

    Ceci dit je ne vois pas bien l'utilité d'obliger le visiteur à se réidentifier à chaque fois. Mais en même temps je n'ai pas tous les détails du contexte.
    Ce que je recherche en fait, c'est proposer à l'internaute un logout, suite à un login réussi. Autrement dit: le login réussi renvoie sur une page de bienvenue ou il existe un lien [logout], qui renvoie à la même page mais avec, dans mon CGI, une fonction 'Authorized = false' (pour obliger l'identification).
    Suis-je plus clair?

  13. #13
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Oui c'est assez claire.
    Mais dans ce cas là, pourquoi avoir une fonction de logout puisqu'il n'y a pas réelement de login ?

    En effet ce concepte de login/logout n'est applicable que si il y a une session (ou quelque chose qui y ressemble) sur le serveur. Or, dans le cas d'une identification par HTTP il n'existe aucune session au niveau serveur.

    Lors d'un login, le client envoi le mdp au serveur, celui-ci enregistre que telle ip s'est bien connecté et ne redemandera plus de mdp durant un certain temps.
    Dans de cas d'une identification HTTP, le client va envoyer son mdp au serveur, s'il est bon le serveur renvoi la page demandé. Puis pour la page suivant le navigateur renvoi encore le mdp. Il n'y a aucune donnée stoqué sur le serveur et donc pas de session.
    Sans sessions on ne peut pas parler de login/logout.


    Ton problème est sans solution car justement, ce problème ne peut être posé.
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  14. #14
    Membre confirmé
    Avatar de didier.cabale
    Homme Profil pro
    Conseil - Consultant en systèmes d’information
    Inscrit en
    Août 2004
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d’information
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2004
    Messages : 130
    Points : 522
    Points
    522
    Par défaut
    Mais dans ce cas là, pourquoi avoir une fonction de logout puisqu'il n'y a pas réelement de login ?
    J'assimile l'authentification basique à un login.

    Dans de cas d'une identification HTTP, le client va envoyer son mdp au serveur, s'il est bon le serveur renvoi la page demandé. Puis pour la page suivant le navigateur renvoi encore le mdp. Il n'y a aucune donnée stoqué sur le serveur et donc pas de session.
    Le pb est en effet que la persistance du login/mdp est géré par le navigateur, et pas par le serveur .. ->

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

Discussions similaires

  1. [MySQL] Durée de Validité d'un SET NAMES
    Par codefalse dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 30/09/2008, 10h33
  2. Limitation de la durée de validité de l'appli ?
    Par bastringue dans le forum Sécurité
    Réponses: 4
    Dernier message: 06/05/2008, 21h31
  3. Durée de validité d'un mot de passe
    Par aicfr dans le forum Sécurité
    Réponses: 1
    Dernier message: 09/12/2006, 14h45
  4. [nom de domaine] durée de validité
    Par sympho dans le forum Domaines
    Réponses: 3
    Dernier message: 18/12/2005, 13h08
  5. Durée de validité d'un export
    Par Righetto Dominique dans le forum Linux
    Réponses: 3
    Dernier message: 07/04/2004, 12h14

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