Programmes CGI avec Delphi et Kylix - 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 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; |
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','+','/'
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 +