La gestion de mots de passe

 

De Eric Roumégou.

Comment gérer une popup pour inviter un mot de passe ?

Je vous renvoie à la LST 57 où il y a des exemples de gestion de popUp. Hélas, on se trouve toujours avec exclusivement des traitements en code navigateur côté popUp; ce qui est quand mème hyper limité. Donc voici ma solution.

Soit la fenêtre suivante nommée SECURITE. Elle est destinée à saisir un mot de passe, contrôler que le mot de passe est bon et enchainer les traitements à suivre.

Il y a un champs caché hiddenPw de type texte et un champ caché Flag de type numérique.

La serrure est un bouton de type submit.

Le champs mot de passe Yourpwd est un champs texte avec la coche mot de passe.

Un lien Annuler complête le tout.

 

 

 

 

Déclarations globales de SECURITE (serveur)
PROCEDURE SECURITE(pId=0,pRefext="",pCle="AUT_ID")
commande est une chaîne
pwdgood est chaîne
Initialisation de SECURITE (serveur)
// Recherche le bon mot de passe dans la table AUTHENTIF soit par l'id, soit par le code page passé en parm
SELON pCle
CAS "AUT_ID"
    commande="SELECT AUT_PWD FROM AUTHENTIF WHERE AUT_ID="+pId
AUTRE CAS
    commande="SELECT AUT_PWD FROM AUTHENTIF WHERE AUT_REFEXT="+Quote(pRefext)
FIN
hiddenPw=""
Flag=1
pwdgood=Crypte(Rtv_colonne(commande),Crypte(PagePrécédente(), NetAdresseIP()))&

On reçoit donc en paramètres le n° de sécurité (pId) ou son code alpha (pRefext). On va donc lire la table AUTHENTIF selon l'une ou l'autre de ces clés.
La fonction Rtv_Colonne permet de lire et retourner la valeur induite par la requête SQL. Le mot de passe est doublement crypté.

Chargement (onload) de SECURITE (navigateur)

SI Flag=2 ALORS   //on peut fermer le popup
    Flag=1
    JSMéthode("window.opener","ExecuteBouton")
    NavigateurFerme()
FIN

Important : C'est ce qui va permettre d'inverser la préséance du code navigateur sur le code serveur. Au lieu d'avoir ce code dans le traitement navigateur du bouton, on le met en Onload en jouant sur le champs caché Flag.

ExecuteBouton est une procédure navigateur de la page appellante.

Clic de serrure (serveur)

hiddenPw=Crypte(YourPwd,Crypte(PagePrécédente(), NetAdresseIP()))
SI hiddenPw<>"" ALORS
  SI hiddenPw=pwdgood ALORS
      Flag=2 // ferme la fenêtre
  SINON
      Flag=1 // laisse ouvert
      Erreur("Mot de passe incorrect")
  FIN
FIN

Pas de traitement en code navigateur car on a besoin d'effectuer ce traitement en code serveur (pour le cryptage).
Remarque : sans le cryptage, il aurait été possible de passer ces tests en code navigateur et fermer directement la pop up (sans passer par le onload et la gestion du flag).
Mais c'est précisément ce que je reproche à l'exemple de la LST 57, on n'a que des traitements en code Navigateur et on élude le problème des contrôles en code serveur. Car bien souvent vous aurez besoin de lire une table ou un fichier et donc de passer par un traitement serveur pour valider la donnée saisie. Par exemple dans ce cas, si on utilise pas le cryptage, n'importe qui ouvrant le source de la page accède au contenu du mot de passe.

Dernière chose, le lien Annuler comprend un NavigateurFerme() dans le code Navigateur afin de permettre à l'internaute de sortir proprement s'il ne connaît pas le mot de passe.

La fenêtre Appelante.

Il faut :
- une variable globale à l'écran
gsSECURITY est un entier

un bouton BtnSECURITY caché qui déclenchera les opérations de retour de votre fenêtre popUp.

Clic de BtnSECURITY (serveur)

SELON gsSECURITY
CAS 1
    ExécuteTraitement(MajClassement,trtProcédure)
CAS 2
    ExécuteTraitement(TesteProc,trtProcédure)
AUTRE CAS
    Info("je viens d'où là ???")
FIN

gsSECURITY=0

Le lien "sécurisé" ou le bouton devra contenir ces codes

Clic (onclick) de lien3 (navigateur)

//Ouverture de la Popup : On utilise la procédure navigateur OuvrePopup()
// Syntaxe : OuvrePopup(<NomPage>,<Position>,<Coordonnée horizontale>,<Coordonnée verticale> )
ChangeDestination(OuvrePopup("","CentréeEcran"))

Principe : on initie gsSECURITY pour tel le petit Poucet retrouver son chemin au retour et savoir d'où l'on vient et on appelle la popup.

Clic de lien3 (serveur)
gsSECURITY=1
PageAffiche(SECURITE,0,"MONCODE","AUT_REFEXT")

Je demande l'affichage d'une page mot de passe pour le code MONCODE
Et les procedures locales Navigateur

PROCEDURE ExecuteBouton()
//Cette procédure simule le clic sur un bouton.
PageValide("","BtnSECURITY")

cette procédure récupérée de la LST 57

// Syntaxe : OuvrePopup(<NomPage>,<Position>,<Coordonnée horizontale>,<Coordonnée verticale> )
// Paramètres :
// - _NomPage : URL quand il s'agit d'une page quelconque sur Internet.
//Si on veut ouvrir une page du projet, on laisse une chaîne vide. La page sera ouverte ensuite en code serveur avec PageAffiche()
// - _Position : Position de la Popup par rapport à la page appelante :
// - "CentréeMère" : centrée par rapport à la page appelante
// - "CentréeEcran" : Centrée par rapport à l'écran (pas de gestion du double écran)
// - "PosPerso" : le coin haut gauche de la fenêtre popup positionné à des coordonnées précisées
// - "" : C'est le navigateur qui décide
// - autres cas : C'est le navigateur qui décide
// - _x : Coordonnée horizontale du coin haut gauche de la fenêtre de la popup (uniquement quand _Position = "PosPerso")
// - _y : Coordonnée horizontale du coin haut gauche de la fenêtre de la popup (uniquement quand _Position = "PosPerso")
// Valeur de retour :
// Chaîne : nom du nouveau navigateur.

PROCEDURE OuvrePopup(_NomPage="",_TypePosition="",_x=0,_y=0)

//Dimensions de la popup
eLarg, eHaut sont des entiers
eLarg = 300
eHaut = 400


SELON _TypePosition
CAS "CentréeEcran"
   NavigateurOuvre(_NomPage,"POPUPWB",ONSimple,eLarg,eHaut,SysXRes()/2-eLarg/2,SysYRes()/2-eHaut/2)
CAS "PosPerso"
   NavigateurOuvre(_NomPage,"POPUPWB",ONSimple,eLarg,eHaut,_x,_y)
CAS ""
   NavigateurOuvre(_NomPage,"POPUPWB",ONSimple,eLarg,eHaut)
AUTRE CAS
   NavigateurOuvre(_NomPage,"POPUPWB",ONSimple,eLarg,eHaut)
FIN

//Renvoie le nom du nouveau navigateur.
RENVOYER "POPUPWB"

 

Voilà beaucoup de galères pour accoucher de cette solution. J'ai notamment peiné pour passer un paramètre à la procédure ExecuteBouton. En effet si celui ci était visible (par un info par ex), il n'était pas accepté par le PageValide. Comme souvent, meme si le code nous paraît logique et valide, cela ne fonctionne pas que l'on reste tributaire de ce que le moteur WebDev a prévu de générer.

Donc mixez cet exemple avec ceux de la LST 57 ... mais pfouuhh c'est fatiguant cette débauche d'énergie pour un truc si simple en WinDev !!!