La protection par mot de passe
Ce que l'on sait déjà Lorsque le programme
CGI renseigne l'entête CGI, le serveur la complète avec divers
informations; notamment il indique que la requête c'est bien
déroulée :
HTTP/1.0 200 OK
Ce qu'il faut savoir Si vous utiliser mon "browser web
text" (voir ma
page
delphi), vous verrez que l'entête HTTP d'un site
sécurisé est un peu particulière :
HTTP/1.0 401 Unauthorized
Content-type: text/html
WWW-Authenticate: Basic realm="/MyRealm"
<html><head><title>401 Unauthorized</title></head><body>
<h1>You need a password to access this page !</h1>
</body></html>
ici le serveur renvoie l'erreur 401 Unauthorized,
dès lors votre browser sait qu'il se trouve sur un site
protégé. Sans afficher d'erreur il va vous demander le mot de
passe pour le domaine précisé (realm="/MyRealm"). Si vous
saisissez un profile/mot de passe valide pour le serveur, celui-ci vous donnera
accès à la page désirée, sinon le browser affiche
le message qui suit l'entête 401. vous n'avez pas tout compris,
bon, relisez tranquillement toute l'info y est !
L'entête HTTP Si vous avez compris ce qui
précède, vous êtes déjà en train de saisir le
programme suivant :
Program EssaiPWD;
{$apptype console}
begin
WriteLn('HTTP/1.0 401 Unauthorized');
WriteLn('Content-type: text/html');
WriteLn('WWW-Authenticate: Basic realm="/Essai"');
WriteLn;
WriteLn('mot de passe s.v.p.');
end;
...et vous ralez déjà contre votre serveur (ou
contre moi), car ça marche pas ! Pas de panique ! C'est normal, je vous
avais déjà dit que le serveur complétait l'entête
HTTP... et bien, le CGI ci-dessus arrive sur le browser de cette façon :
HTTP/1.0 200 OK
HTTP/1.0 401 Unauthorized
Content-type: text/html
WWW-Authenticate: Basic realm="/Essai"
mot de passe s.v.p.
La première ligne indique donc que la requête
se passe bien (merci le serveur), la seconde est ignorée. J'ai pas mal
galèré pour trouver comment éviter ça, finalement
la réponse est tout simplement dans la norme CGI : le nom du CGI doit
commencer par "nph-" s'il gère lui même l'entête
HTTP. Et voilà, tout est dit, il suffit de renommer
le programme ci-dessus en "NPH-ESSAIPWD.EXE" et ça marche !
Enfin, ça marche presque puisque le mot de passe n'est pas
validé !
WWW-Authenticate Alors, le browser reçoit une
demande d'authentification : WWW-Authenticate: Basic realm="/MyRealm" En
réponse, le CGI reçoit le profile/mot de passe dans la variable
d'environnement HTTP_AUTHORIZATION
HTTP_AUTHORIZATION=Basic dXNlcjpwYXNzd29yZA==
Pour valider cette information, il faut la
décoder...elle est en effet au format Base64. Petit rappel sur
les bases (cours de mathématique de primaire ! ):
- Habituellement on travaille en base 10 : 0..9
- En informatique on utilise couramment la base 16 :
0..9,'A'..F'
- Sur internet on utilise la base 64 : 'A'..'Z','a'..z','+','/'
Vous trouverez dans le programme exemple une unité Base64 qui prend en charge de
codage/décodage d'un type String en base 64. le texte ci-dessus
une fois décodé donne tout simplement : "user:password"
Il ne reste plus au CGI qu'a accepter le mot de passe en envoyant les
informations demandées ou renvoyer l'erreur 401. Une autre
alternative sur un mot de passe invalide étant de rediriger sur la page d'acceuil par exemple. Pour
la mise en pratique, téléchargez le programme login (sans oublier de renommer l'executable et le point
ini en nph-login.exe et npg-login.ini) c'est tout ! A +
Suite du tutoriel : Sommaire,
Introduction, Les
paramètres, Redirection, Les images, protection par mot de passe,
Les cookies, Base de
données, FAQ
|