IFT1147
Programmation Serveur Web avec PHP Authentification
IFT1147 - Authentification 2
Plan
Authentification par adresse IP
Authentification HTTP
htaccess
PHP
Authentification par formulaire HTML
Sans encryption
Avec encryption
HTTPS
Authentification par adresse IP
Une façon très simple d’authentifier un groupe d’usagers
IFT1147 - Authentification 4
Authentification par IP
Une façon très simple pour limiter l’accès à un site est de n’autoriser que certaines adresses IP.
Le tableau associatif $_SERVER contient la clé REMOTE_ADDR qui pointe vers l’adresse IP du client.
C’est donc aussi simple que
if ($_SERVER["REMOTE_ADDR"]== … )
IFT1147 - Authentification 5
IP - Avantage et utilisation
Très simple à utiliser
Utilisé par exemple par des journaux scientifiques afin de permettre l’accès à un campus au complet
Un firewall peut être utilisé dans le même but …
IFT1147 - Authentification 6
IP - problèmes
Aucune combinaison de login et mot de passe - tout le monde possède les mêmes droits.
Un réseau complet d’ordinateurs derrière un proxy peut posséder la même adresse IP.
L’adresse IP d’un ordinateur peut changer d’une requête à une autre.
Authentification HTTP
Servons-nous des possibilités incorporées au protocole HTTP
IFT1147 - Authentification 8
Authentification HTTP
Requête pour le document et réponse qu’une authentification est nécessaire
GET /~dift1147/exemples/Securite/Apache/page1.php HTTP/1.1
Host: www-desi.iro.umontreal.ca […]
HTTP/1.x 401 Authorization Required WWW-Authenticate: Basic
realm="IFT1147 - Exemple htaccess"
[…]
IFT1147 - Authentification 9
Authentification HTTP
Le navigateur présente alors une boîte de dialogue à l’usager et retourne ensuite sa requête.
GET /~dift1147/exemples/Securite/Apache/page1.php HTTP/1.1
Host: www-desi.iro.umontreal.ca Authorization: Basic dGVzdDp0ZXN0 […]
HTTP/1.x 200 OK […]
IFT1147 - Authentification 10
Le fichier .htaccess
Afin d’indiquer à Apache qu’une authentification est nécessaire pour un répertoire, on place un fichier de nom .htaccess dans le répertoire en question.
On protège ainsi tous les documents dans le répertoire et dans ses sous- répertoires.
Contenu de .htaccess
AuthName "IFT1147 - Exemple htaccess"
AuthType Basic AuthUserFile
/home/www-desi/usagers/dift1147/.htpasswd require valid-user
AuthUserFile indique le nom du fichier contenant les logins et mots de passe.
htpasswd
Le fichier .htpasswd doit être créé avec la commande htpasswd
$ htpasswd -c .htpasswd usager New password:
Re-type new password:
Adding password for user usager
$
Le paramètre -c sert à créer le fichier.
IFT1147 - Authentification 13
htaccess et htpasswd - remarques
Les fichiers .htaccess et .htpasswd doivent tous les deux être en lecture pour tout le monde. Sinon,
l’authentification échoue !
Idéalement, on place le fichier
.htpasswd dans un répertoire qui n’est pas accessible par le Web.
IFT1147 - Authentification 14
htaccess et htpasswd - remarques
Afin d’enlever un usager, il suffit
d’effacer la ligne correspondante dans le fichier .htpasswd.
Le fichier .htaccess peut aussi servir à donner d’autres instructions à Apache à part celles d’authentification.
IFT1147 - Authentification 15
htaccess et htpasswd - désavantages
Il n’est pas facile de créer un logout.
L’usager ne peut pas facilement lui- même changer son mot de passe; il n’y a pas d’infrastructure prévue à cet effet. À la limite, vous pourriez créer une interface Web pour l’appel à htpasswd
… avec tous les problèmes de sécurité que cela entraîne !
IFT1147 - Authentification 16
Authentification HTTP et PHP
Le login et le mot de passe fournis par l’usager sont accessibles en PHP. On peut ainsi créer des affichages particuliers pour chaque usager.
$_SERVER["PHP_AUTH_USER"] et
$_SERVER["PHP_AUTH_PW"] sont les deux variables à utiliser.
IFT1147 - Authentification 17
Et sans le fichier .htaccess
PHP permet d’envoyer des en-têtes HTTP avec la fonction header().
On peut donc très bien envoyer le code 401, recevoir en PHP le login et le mot de passe fournis par l’usager et créer sa propre fonction d’authentification.
Authentification avec un formulaire
À vous la puissance et
l’obligation de défendre vos choix de sécurité
IFT1147 - Authentification 19
Authentification avec un formulaire
L’authentification avec un formulaire permet la plus grande liberté. Vous définissez le formulaire, les critères pour un login et un mot de passe valides, etc.
On peut aussi facilement créer un formulaire permettant à l’usager de changer son mot de passe.
IFT1147 - Authentification 20
Login et mot de passe - BD
Lorsque l’authentification est gérée par un formulaire, il faut sauvegarder le login et le mot de passe côté serveur; la plupart du temps dans une BD.
Le login doit être unique pour chaque usager. On place donc une clé unique (ou primaire, selon les besoins) sur la colonne login.
IFT1147 - Authentification 21
Première recette de vérification
$returnValue = false;
$requeteID = mysql_query("SELECT password FROM users
WHERE login='$userLogin'");
if (mysql_num_rows($requeteID) > 0) { $ligne = mysql_fetch_assoc($requeteID);
if ($userPwd == $ligne["password"]) { $returnValue = true;
} }
IFT1147 - Authentification 22
Dangers de cette recette
Les mots de passe ne sont pas encryptés.
Tout le monde qui a accès à la base de données peut donc, potentiellement, connaître le mot de passe de chaque usager.
Souvent, on encrypte donc les mots de passe.
Fonction à sens unique
Une fonction à sens unique est une fonction qui se calcule facilement dans un sens, mais pas du tout, ou seulement très difficilement, dans le sens inverse.
Il ne faut jamais encrypter de données dont on aura besoin dans le futur avec une fonction à sens unique: on ne
md5()
La fonction md5() est une fonction à sens unique.
Elle est définie en détail à
http://www.faqs.org/rfcs/rfc1321.html
Elle retourne une « signature » unique de 32 charactères du message fourni en entrée.
IFT1147 - Authentification 25
Authentification avec encryption
Lorsque l’usager s’inscrit au site, il fournit un login et un mot de passe. Le mot de passe est sauvegardé de façon encrypté dans la base de données.
Lorsque l’usager retourne sur le site, il entre son login et mot de passe. Le mot de passe est encrypté de nouveau et comparé à la version sauvegardée.
IFT1147 - Authentification 26
Deuxième recette de vérification
$returnValue=false;
$requeteID = mysql_query("SELECT password FROM users
WHERE login='$userLogin'");
if (mysql_num_rows($requeteID) > 0) { $ligne=mysql_fetch_assoc($requeteID);
if (md5($userPwd) ==
$ligne["password"]) { $returnValue=true;
} }
IFT1147 - Authentification 27
Encore un peu plus de sécurité
Deux usagers peuvent choisir le même mot de passe. L’encryption de leur mot de passe par md5() retournera alors deux fois la même signature.
Ceci n’est généralement pas souhaitable pour la sécurité. Mieux vaut concaténer le login avec le mot de passe afin de former des encryptions uniques.
IFT1147 - Authentification 28
Troisième recette de vérification
$returnValue=false;
$requeteID = mysql_query("SELECT password FROM users
WHERE login='$userLogin'");
if (mysql_num_rows($requeteID) > 0) { $ligne=mysql_fetch_assoc($requeteID);
if (md5($userLogin . $userPwd) ==
$ligne["password"]) { $returnValue=true;
} }
IFT1147 - Authentification 29
md5() et MySQL
MySQL contient aussi une fonction md5()
Il est plutôt dangereux de changer la recette précédente à
SELECT count(*) AS nombre FROM users WHERE login='$userLogin’
AND password=md5('$userPwd’ )
Le mot de passe serait transmis en clair entre le serveur Web et le serveur de base de données.
https
Et encore plus de sécurité …
IFT1147 - Authentification 31
https
Le protocole https permet d’encrypter les communications entre serveur Web et navigateur.
L’utilisation de https est totalement transparente au niveau PHP.
Par contre, c’est un travail
supplémentaire pour le serveur Web !
IFT1147 - Authentification 32
Certificats
Le protocole https suppose que le serveur Web possède un certificat de sécurité « prouvant » l’identité du serveur Web.
Il est généralement délivré par une entreprise reconnue. Si l’entreprise n’est pas enregistrée dans le navigateur, celui- ci affiche un avertissement.
IFT1147 - Authentification 33
L’authentification est réussie …
Une fois passée l’étape de l’authentifi- cation, l’application doit être capable de se souvenir de l’identité de chaque usager.
Il n’est quand même pas envisageable de demander le login et mot de passe à l’usager à chaque page !
On doit alors se servir d’une gestion de sessions.