|
Publicité ' | ||||||||||||||||||||||
|
|
#1 |
|
Membre régulier
![]() Didier CabaléConseil - Consultant en systèmes d'information Inscription : août 2004 Messages : 102 ![]() |
[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 |
|
|
00
|
|
|
#2 |
|
Membre émérite
![]() Inscription : janvier 2004 Messages : 990 ![]() |
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. |
|
|
00
|
|
|
#3 | |
|
Membre régulier
![]() Didier CabaléConseil - Consultant en systèmes d'information Inscription : août 2004 Messages : 102 ![]() |
Citation:
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 |
|
|
|
00
|
|
|
#4 |
|
Membre émérite
![]() Inscription : janvier 2004 Messages : 990 ![]() |
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. |
|
|
00
|
|
|
#5 | |
|
Membre régulier
![]() Didier CabaléConseil - Consultant en systèmes d'information Inscription : août 2004 Messages : 102 ![]() |
Citation:
Didier |
|
|
|
00
|
|
|
#6 |
|
Membre régulier
![]() Didier CabaléConseil - Consultant en systèmes d'information Inscription : août 2004 Messages : 102 ![]() |
En fait, je pense que mon besoin est impossible à résoudre simplement
Merci pour votre aide |
|
|
00
|
|
|
#7 |
|
Membre émérite
![]() Inscription : janvier 2004 Messages : 990 ![]() |
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. |
|
|
00
|
|
|
#8 | |
|
Membre régulier
![]() Didier CabaléConseil - Consultant en systèmes d'information Inscription : août 2004 Messages : 102 ![]() |
Citation:
Me suivez-vous? |
|
|
|
00
|
|
|
#9 | ||
|
Membre émérite
![]() Inscription : janvier 2004 Messages : 990 ![]() |
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 :
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. |
||
|
|
00
|
|
|
#10 | ||
|
Membre régulier
![]() Didier CabaléConseil - Consultant en systèmes d'information Inscription : août 2004 Messages : 102 ![]() |
Citation:
Citation:
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? |
||
|
|
00
|
|
|
#11 | ||
|
Membre émérite
![]() Inscription : janvier 2004 Messages : 990 ![]() |
Je précise que je ne connais pas du tout le delphi, mais le but est que tu comprenne comment faire :
Code :
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. |
||
|
|
00
|
|
|
#12 | |||
|
Membre régulier
![]() Didier CabaléConseil - Consultant en systèmes d'information Inscription : août 2004 Messages : 102 ![]() |
Citation:
Citation:
Citation:
Suis-je plus clair? |
|||
|
|
00
|
|
|
#13 |
|
Membre émérite
![]() Inscription : janvier 2004 Messages : 990 ![]() |
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. |
|
|
00
|
|
|
#14 | ||
|
Membre régulier
![]() Didier CabaléConseil - Consultant en systèmes d'information Inscription : août 2004 Messages : 102 ![]() |
Citation:
Citation:
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com