Vous êtes sur la page 1sur 16

Gestion des utilisateurs

BEZZAOUIA FEHMI

Sommaire
Conception des formulaires Stockage des mots de passe sur le serveur

L'algorithme md5

Transmissions scurises (HTTPS) Permanence des informations (cookies, sessions) Protection contre les attaques bruteforce Dveloppement

Conception des formulaires


L'authentification commence au moment o vous demandez son mot de passe votre visiteur, voil quelques remarques :

Les champs de type password offrent une protection contre les yeux baladeurs par l'affichage d'astrisques la place des caractres taps, et leurs valeurs ne sont pas mises en cache par le navigateur. Une alternative est la demande du mot de passe par HTTP. Le mot de passe est alors demand directement dans une bote de dialogue, et non dans une page HTML

Remarque : une fois saisis, le navigateur retransmettra automatiquement logins et mots de passe durant toute la session.

Conception des forumulaires (suite)


if (! $PHP_AUTH_USER || ! $PHP_AUTH_PW $PHP_AUTH_PW) ! { header('status: 401 Unauthorized'); header('HTTP/1.0 401 Uauthorized'); header("WWW-authenticate: Basic realm=\"test de l'authentification HTTP\"");//envoie dune boite de dialogue } echo ($PHP_AUTH_USER. ' '. $PHP_AUTH_PW);

Stockage des mots de passe sur le serveur


Pour pouvoir tre compars avec ceux rentrs par les utilisateurs, vos mots de passe doivent tre enregistrs sur votre serveur dans une base de donnes ou un fichier. Pour contrer un piratage du serveur, ils doivent tre chiffrs.

Stockage des mots de passe (suite)


Algorithme MD5
Md5 (message digest 5) est un algorithme transformant vos mots de passe en une chane indchiffrable appele hash. $motdepasse=MD5(motdepassenonchiffre); Exemple de chiffrage : http://pajhome.org.uk/crypt/md5/

Enttes HTTP (I)


le protocole HTTP est le "langage" permettant la transmission des informations sur le web Il est possible denvoyer des enttes particuliers du protocole HTTP grce la commande header. Syntaxe : header($str); Exemples : header(Content-type: image/gif); // spcifie le type dimage gif header(Location: fichier.php); // redirection vers une autre page fichier.php header(Last-Modified: .date(D, d M Y H:i:s). GMT); Les enttes doivent obligatoirement tre envoyes avant laffichage de tout caractre dans la page en cours. Car laffichage force lenvoi des enttes de base.

Transmissions scurises (HTTPS)


HTTPS est le nom donn au protocole HTTP quand il est chiffr avec SSL HTTPS permet l'authentification de votre serveur le secret des informations transmises, dans les deux sens l'intgrit de ces informations. L'achat de certificat n'est pas ncessaire pour authentifier vos utilisateurs, mais pour empcher un pirate de se faire passer pour vous.

Passage de paramtres un script par lURL


Les variables peuvent directement tre passes par lintermdiaire des URL. Exemple : $id = 20; echo <a href=\fichier.php?action=buy&id=$id\>Acheter</a>; Cet exemple va crer dans le script destination les variables globales action et id avec les valeurs respectives buy et 20. La barre dadresse affichera lURL suivante : Ainsi une application web crite en php peut interagir avec lutilisateur de faon dynamique.

Permanence des informations (cookies, session)


Vous pouvez prouver le besoin de conserver des informations d'une page une autre. Ces informations, peuvent tre sensibles et doivent tre protges

Les cookies sont des petits fichiers stocks sur les ordinateurs de vos visiteurs. Vos visiteurs peuvent y avoir accs et les modifier votre insu.

Il n'est donc pas raisonnable de se baser sur les cookies pour savoir par exemple si un utilisateur est bien authentifi ou pas. De mme, authentifier vos visiteurs par un cookie stock lors de leur visite prcdente est courant mais risqu. Le vol de ce cookie permettrait une connexion sans mot de passe.

La mme remarque s'applique aux variables transmises par URL ou par input hidden.

Les sessions
Les sessions de PHP vous permettent de dfinir des variables communes plusieurs scripts, dans un contexte plus scuris, le vol de session reste toutefois encore possible. Seul un identifiant est alors stock chez l'utilisateur. La scurit des sessions est prsente ici : http://www.nexen.net/docs/php/annotee/sessio n.security.php

Protection contre les attaques bruteforce


Une attaque bruteforce consiste essayer un maximum de mots de passe possible en esprant tomber sur le bon Bloquer un compte aprs 3 checs est une mauvaise solution. En effet, il devient alors incroyablement simple de paralyser le serveur, en bloquant tous les comptes utilisateurs.

Protection contre les attaques bruteforce


Il est plus pertinent de bloquer l'IP ayant tent de se connecter. $ip = $_SERVER["REMOTE_ADDR"]; On peut galement temporiser un temps de plus en plus grand avant d'autoriser un nouvel essai. //recupere($temps); sleep($temps); $temps = $temps * 2;

Dveloppement
Cration des cookies
Les cookies servent a enregistrer des donnes sur l'ordinateur du visiteur. Celles-ci peuvent ensuite tre rcupres dans l'ensemble des pages d'un site. Un exemple simple d'utilisation de cookie : enregistrement du nom du visiteur. Il existe plusieurs paramtres a savoir lorsque l'on dfinit un cookie,

setcookie(string nom, string valeur, string expiration, string chemin, string domaine, string securise);
expiration : en secondes securise : Indique si le cookie doit uniquement tre transmis travers une connexion scurise HTTPS : 0 ou 1 si securise=1 le cookie ne sera positionn uniquement si la connexion scurise existe.

Les cookies
Exemple : <?php $nom="mohamed"; setcookie("visiteur", $nom, time()+5);// dure de vie = 5 secondes echo "Bonjour, Mr <br/>". $_COOKIE['visiteur']." Merci pour votre visite"; ?>

Les cookies (suite)


Cookies valeurs multiples
Il est aussi possible d'envoyer un cookie a valeurs multiples, pour cela, on traite le cookie comme un tableau : <?php $cookie[0]++; setcookie("cookie[0]", $cookie[0], time() + 86400, "/"); // restera 24 heures if($cookie[1] == "") setcookie("cookie[1]", $nom_du_visiteur, time() + 86400, "/"); //restera 24 heures echo "Bonjour ".$cookie[1]."< br> Vous avez visit cette page ".$cookie[0]." fois."; ?>

Les cookies (suite)


Dure dexpiration
Lors de la cration d'un cookie, on dfinit la dure de vie de celui-ci, cela permet de garder par exemple 24 heures certaines valeurs. Pour cela, on peut soit dfinir cette expiration par : une dure fixe depuis la cration, soit une date et une heure prcise a laquelle le cookie expire. Exemple : < ?php $expiration = time() + (2 * 86400); // dure de 2*1jour (86400 secondes) setcookie("cookie", "essai", $expiration, "/"); // restera 48 heures echo "Bonjour< br> Ceci est un test de cration de cookie d'une dure de 48 heures..."; ?>

Les cookies (suite)


Pour rcuprer un cookie, il suffit d'utiliser la variable qui est automatiquement cre. Dans notre exemple prcdent, pour rcuprer le nom de visiteur, nous avons utilis la variable suivante car le cookie se nommait " visiteur": $_COOKIE ["visiteur"] - l'information est plus fiable car on est sur que c'est la valeur d'un cookie. Pour supprimer un cookie, c'est trs simple ! Il suffit de dclarer le cookie sans mettre de valeur : < ?php setcookie("compteur"); ?>

Les sessions
Une session est un systme permettant de conserver des valeurs de pages en pages, sans utiliser les paramtres d'url qui ne permettent pas de passer des donnes sensibles de pages en pages et dont le nombre maximum de caractres ne peut excder 255 url comprise.

Les sessions (suite)


Dclaration Pour crer une session, il faut utiliser la fonction suivante : session_start(); A chaque session sont attribus automatiquement un id et nom. Ces variables sont accessibles laide des fonctions suivantes : session_id(); session_name(); Dclaration des variables sessions $_SESSION[nom_var_session]=valeur;

Lappel de ces variables se fait en utilisant la mme syntaxe :


session_start(); echo $_SESSION[nom_var_session];

10

Les sessions (suite)


Destruction :

Des variables :
session_start(); session_unset();

De la session :
session_destroy()

Chargement de fichiers (I)


Les formulaires permettent de transmettre des informations sous forme de chanes de caractres. Ils peuvent aussi permettre un internaute de transmettre un fichier vers le serveur.

Cest la balise HTML suivante : <input type=file /> qui permet le chargement de fichiers. La balise FORM doit ncessairement possder lattribut ENCTYPE de valeur multipart/form-data. La mthode utilise sera POST. De plus, il est utile dimposer au navigateur une taille de fichier limite par le paramtre MAX_FILE_SIZE dont la valeur numrique a pour unit loctet.

11

Chargement de fichiers (II)


Exemple : echo <form action=\$PHP_SELF\ method=\POST\ Champ Description ENCTYPE=\multipart/form-data\>\n name nom du fichier chez le client <input type=\hidden\ name=\MAX_FILE_SIZE\ value=\1024000\ />\n <input type=\file\ name=\mon_fichier\ /><br />\n type type MIME du fichier <input type=\submit\ value=\envoyer\ />\n size taille du fichier en octets </form>\n;
tmp_name nom temporaire du fichier sur le serveur Pour rcuprer le fichier, il faut utiliser la variable denvironnement $HTTP_POST_FILES qui est un tableau associatif dont les champs sont les noms des champs HTML file du formulaire. Par exemple : $HTTP_POST_FILES[mon_fichier] o mon_fichier est le nom donn au champs du formulaire HTML de type file. La variable $HTTP_POST_FILES[mon_fichier] est elle aussi un tableau associatif possdant les champs suivants : Si aucun fichier na t envoy par le client, la variable mon_fichier vaudra la chane de caractres : none ou bien (chane vide). La dure de vie du fichier temporaire sur le serveur est limite au temps dexcution du script. Pour pouvoir exploiter ultrieurement le fichier sur le serveur, il faut le sauvegarder dans un rpertoire et lui donner un vrai nom.

Chargement de fichiers (III)


Exemple du cas du chargement de ce qui doit tre une image GIF de moins de 1024.000 octets : // cration dune variable contenant toutes les infos utiles $file = $HTTP_POST_FILES[mon_fichier]; // si un fichier a bien t envoy : if($file || ($file != none)) { // extraction du nom du fichier temporaire sur le serveur : $file_tmp = basename($file[tmp_name]); // vrification de la taille et du type MIME if(($file[size] <= 1024000) || ereg(gif$,$file[type])) // nouveau nom, emplacement et extension du fichier : $file_def = $dir./.$name...$ext; // copie du fichier temporaire dans son nouvel emplacement : copy($file_tmp, $file_def); } }

12

Chargement de fichiers (IV)


Il est important de vrifier avec is_file() si un fichier du mme nom existe dj sur le serveur lemplacement o on veut copier le nouveau fichier. On pourra supprimer lancien fichier avec unlink() (qui ne fonctionne pas avec les serveurs fonctionnant sous Windows). basename() permet de connatre le nom du fichier partir de son chemin (+nom) complet. Mme si le paramtre MAX_FILE_SIZE est inclus dans le formulaire, il est important de vrifier la taille du fichier rceptionn car rien nempche un internaute malveillant de modifier en local sur sa machine le formulaire pour y soustraire le champs cach MAX_FILE_SIZE afin de saturer le serveur avec des fichiers trop volumineux. La vrification du type MIME du fichier est galement importante dans le cas o on ne souhaite rceptionner que des types de fichiers bien particuliers (des images GIF, JPEG ou PNG par exemple).

Chargement de fichiers (V)


Pour charger simultanment plusieurs fichiers, il suffit de rajouter des crochets au nom du champ HTML file, et de mettre autant de champs file que dsir. Exemple : <input type=file name=mes_fichiers[] /> <input type=file name=mes_fichiers[] /> <input type=file name=mes_fichiers[] /> <input type=file name=mes_fichiers[] /> Dans cet exemple, linternaute pourra charger jusqu quatre fichiers.

13

Chargement de fichiers (VI)


A la rception, la variable $HTTP_POST_FILES sera un tableau de tableaux associatifs. Exemple : $files_tab = $HTTP_POST_FILES[mes_fichiers]; foreach($files_tab as $file) {
/* faire le traitement vu prcdemment : - extraire le nom du fichier temporaire sur le serveur - vrifier la taille et le type MIME - donner un nouveau nom, emplacement et extension du fichier - copier le fichier temporaire dans son nouvel emplacement */}

Les fichiers temporaires sont gnralement placs dans le rpertoire /tmp du serveur. Cest la directive de configuration upload_tmp_dir du fichier php.ini qui dtermine lemplacement des fichiers chargs par la mthode POST.

Chargement de fichiers (VII)


On aurait pu procder autrement quavec des crochets, en utilisant directement dans le formulaire HTML des champs file de noms compltement diffrents. Exemple : <input type=file name=mon_fichier /> <input type=file name=mon_autre_fichier /> Par contre, la rception, on ne peut plus utiliser de boucle ! Exemple : $file = $HTTP_POST_FILES[mon_fichier]; // puis faire le traitement vu prcdemment $file = $HTTP_POST_FILES[mon_autre_fichier]; // puis refaire encore le mme traitement Lapproche utilisant des crochets convient au cas o le nombre de fichiers charger est dynamique (non connu lavance, dpend de paramtres divers).

14

Chargement de fichiers (VIII)


Pour les versions PHP4 suprieures la 4.0.2, il existe une autre mthode, plus simple :
Exemple 1 : // vrification que le fichier a bien t envoy par la mthode POST if (is_uploaded_file($mon_fichier)) { // dplace le fichier dans le rpertoire de sauvegarde copy($userfile, $dest_dir); } Exemple 2 : /* dplace directement le fichier dans le rpertoire de sauvegarde en faisant les vrifications ncessaires */ move_uploaded_file($mon_fichier, $dest_dir);

Mail (I)
La fonction mail envoie un message lectronique. Syntaxe : mail($recipient, $subject, $message[, $headers, $params]); Exemple : $message = Allez sur le site php.net, vous y trouverez un tutoriel complet sur les fonctions PHP et MySQL.; mail(vous@labas.tn, Aide sur PHP, $message); Les arguments obligatoires sont le destinataire, le sujet du message ainsi que le message proprement dit. Les enttes et paramtres additionnels sont facultatifs. Note: cette fonction ne marche que si un programme de messagerie lectronique (appel mailer ) est pralablement install sur le serveur.

15

Mail (II)
Exemple plus complet :
<?php $recipient = Mohamed <med@gmail.com>, ; $recipient .= Amine <amine@gmail.com>; $subject = Notre rendez-vous; $message = Je vous propose le lundi 09 mai \n; $message .= --\r\n; // Dlimiteur de signature $message .= Le pringtemps ; $headers = From: heni <heni@yahoo.com>\n; $headers .= Content-Type: text/html; charset=iso-8859-1\n ; $headers .= Cc: sami@gmail.tn\n; mail($recipient, $subject, $message, $headers); ?>

16