TP : Accès sécurisé par formulaire

Transcription

TP : Accès sécurisé par formulaire
Cours de Système d'Information
F. Depaulis - ESTIA
TP : Accès sécurisé par formulaire
Ce TP propose de mettre en application le recueil et le traitement d'informations à partir de la
mise en place d'un formulaire sécurisé.
Buts pédagogiques : création d'un formulaire HTML, récupération des données et traitement
par un script php.
L'environnement
Pour faire fonctionner un script php on a besoin : d'un serveur http, d'un serveur php et d'un
client http. Ces trois éléments peuvent être installés sur des machines différentes (c'est
d'ordinaire le cas au moins pour le client) mais ils peuvent également se trouver sur un seul
ordinateur. Dans le cadre de cette série de TP, nous utiliserons un package (EasyPhp) qui
comprend les deux serveurs.
Pour lancer les serveurs, allez dans le menu Démarrer>Programmes>EasyPhp 1.7.
Une fois cette opération réalisée, une icône doit apparaître en bas à droite de l'écran. Quand le
petit point rouge du E clignote, cela signifie que les serveurs sont en route.
Vous devez placer toutes vos pages et tous vos scripts dans le répertoire : www situé dans le
répertoire d'installation d'EasyPhp (u:\EasyPHP1-7\www).
"Hello World"
1. Créez un fichier nommé "helloworld.html" (rappel, vous devez l'enregistrer dans le répertoire
racine du serveur http u:\EasyPHP1-7\www). Editez le (avec BlocNote par exemple) pour
qu'il représente une page Web affichant simplement le message "Hello World". Ouvrez le
dans un navigateur.
2. Modifiez l'extension du fichier pour le nommer "helloworld.php". Ouvrez le dans un
navigateur en double cliquant dessus.
Que se passe-t-il ? Comment expliquez-vous que vous n'obteniez pas le même résultat ?
Explications : Pour que votre script php soit "interprété" par le serveur php, celui-ci doit
"passer" par le serveur http (c'est lui qui est chargé de faire cette opération). En ouvrant une
page directement, vous utilisez Internet Explorer comme un explorateur de fichier. Celui-ci
peut interpréter le code HTML mais ne sait pas quoi faire du code php. Pour résoudre ce
problème, vous devez spécifiez, dans la barre d'adresse, l'URL contenant l'adresse du serveur
HTTP. Pour ça, il vous faut utiliser l'adresse IP 127.0.0.1 . Il s'agit d'une adresse spéciale
qui désigne TOUJOURS le serveur HTTP de la machine sur laquelle on se trouve (si celui-ci
existe). Pour visualiser correctement votre page, vous devez donc taper :
http://127.0.0.1/helloworld.php
3. Modifiez le fichier "helloworld.php" : celui-ci doit maintenant contenir un script php qui
déclare une variable "$message" contenant le message "Hello World", et qui affiche le
contenu de cette variable à l'écran. Visualisez dans Internet Explorer. Faites un clic droit sur
la page et sélectionnez "Afficher la source". Que constatez-vous ?
4. Modifiez l'extension du fichier en le renommant : "helloworld.html". Essayez de le visualiser
dans Internet Explorer. Faites un clic droit sur la page et sélectionnez "Afficher la source".
Que constatez-vous ?
Accès sécurisé par formulaire
On veut restreindre l'accès d'un site à certains utilisateurs, authentifiés par mot de passe. Cette
série d'exercices va vous amener en plusieurs étapes à réaliser un script php permettant de
remplir cette fonction.
1. Créez une page HTML nommée "login.html" comportant un formulaire. Celui-ci comprend
un champ "Texte" permettant à un utilisateur de saisir son "login", et un bouton de type
"Submit" permettant de valider les informations. Ce formulaire doit appeler la page php
nommée "bienvenue.php", que nous construirons plus tard.
2. Créez un fichier nommé "bienvenue.php". Celui-ci représente une page Web qui affiche le
message "Bienvenue NOM_PERSONNE", où NOM_PERSONNE est la valeur saisie par un
utilisateur dans le formulaire de la page "login.html".
3. Testez l'enchaînement entre la page "login.html" et le script "bienvenue.php".
4. Modifiez le formulaire de la page "login.html" en ajoutant un champ de type "Mot de passe".
Modifiez également le script "bienvenue.php" de façon à ce que la page affiche un message
d'erreur et un lien de retour vers "login.html" si le mot de passe saisi est différent de
"jimjarmush", et continue à afficher "Bienvenue ..." sinon.
5. Modifiez le mot de passe d'accès en mettant ce que vous voulez et tester le script de votre
voisin en utilisant l'adresse IP de sa machine (Pour connaître l'adresse de votre ordinateur,
procédez comme suit : allez dans Demarrer>Accessoires>Invite de commandes, puis tapez la
commande ipconfig).
6. On veut stocker des mots de passe différents pour plusieurs utilisateurs. Pour ça, on va utiliser
un fichier(1) "passwd.txt" contenant les logins et mots de passe de tous les utilisateurs :
chaque ligne contient un login et un mot de passe séparés par deux points ":". Chaque fin de
ligne contient le caractère ":".
fabrice:jim342:
john:12fds4:
...
Modifiez le script du fichier "bienvenue.php" afin qu'il réalise l'authentification d'un
utilisateur grâce à ce fichier. En plus des opérations de gestion de fichiers(1), vous aurez
besoin de la fonction "explode(2)".
Conseil : écrivez et utilisez une fonction respectant les spécifications suivantes :
/**
* Retourne le mot de passe associé à un login dans le fichier
"passwd.txt", ou une chaîne vide
* si le login n'est pas présent dans le fichier.
* Entrée/ $login : une chaîne de caractères représentant le login d'un
utilisateur
* Sortie/ $passwd : le mot de passe associé à $login ou une chaîne vide
si le login n'existe pas dans
* le fichier "passwd.txt"
*/
function getPasswd(string login){ ... }
7. A chaque connexion ou tentative ratée de connexion, on veut stocker : le login, la date(3) et le
statut (réussie, échouée) dans un fichier "Log". Modifiez le script du fichier "bienvenue.php"
afin qu'à chaque appel, il ajoute à un fichier "log.txt" les informations relatives à la tentative
de connexion.
Implémentation
(1) Gestion de fichiers
/**
* Ouvre un fichier pour consultation ou modification.
* Entrée/ $url : chaîne de caractères contenant le path du fichier à ouvrir
* si $path commence par "<protocole>://", il est considéré comme une url
* Entrée/ $mode : chaîne de caractères contenant le mode d'ouverture du
fichier
* r (resp. a) -> lecture seule, curseur en début (resp. fin) de fichier
* r+ (resp. a+) -> lecture/écriture, curseur en début (resp. fin) de fichier
* Sortie/ $fid : l'identifiant permettant de manipuler le fichier ouvert
* Remarque : c'est ce fid qui est utilisé dans les fonctions suivantes
*/
$fid = fopen(string url, string mode)
/**
* Ferme un fichier préalablement ouvert.
* Entrée/ $fid : l'identifiant du fichier à fermer
*/
fclose(identificateur fid)
/**
* Récupère la ligne courante d'un fichier et passe à la ligne suivante.
* Entrée/ $fid : l'identifiant du fichier dont on récupère la ligne
* Entrée/ $max : le nombre de caractères auquel on se limite
* Sortie/ $ligne : une chaîne de caractères contenant les max premiers
caractères
* de la ligne courante du fichier $fid
*/
$ligne = fgets(identificateur fid, entier max)
/**
* Inscrit une chaîne de caractères à la position courante d'un fichier.
* Entrée/ $fid : l'identifiant du fichier dans lequel on veut écrire
* Entrée/ $ligne : la chaîne de caractères à inscrire dans le fichier
*/
fputs(identificateur fid, string ligne)
/**
* Teste si le curseur est arrivé à la fin du fichier.
* Entrée/ $fid : l'identifiant du fichier dont on teste la position du
curseur.
* Sortie/ $bool : un booléen qui vaut vrai si l'on est à la fin du fichier
(dernière ligne lue)
*/
$bool = feof(identificateur fid)
(2) Explode
/**
* La fonction explode segmente une chaîne en un ensemble de sous chaînes,
sous la forme d'un tableau.
* La segmentation se fait en définissant un séparateur.
* Exemple :
* $liste = "tennis-badminton-pala-pelote-tennis de table-jokari";
* $tableau = explode ("-", $liste);
* => $tableau [0] == tennis, $tableau [1] == badminton, ...
* Entrée/ $separator : une chaîne de caractère définissant le séparateur
*/
explode (string separator, string chaineDeDepart)
(3) Gestion des dates
/**
* Retourne une chaîne de caractères contenant la date actuelle au format
anglais
* Y-m-d H:i:s
* E/ $format : une chaîne de caractères permettant de spécifier le format
* ex : "Y-m" => 2004-02; "h:i:s" => 15:20:14
* S/ $date : une chaîne de caractère contenant la date courante
*/
date(string format)