Plan Authentification par IP IP - Avantage et utilisation IP
Transcription
Plan Authentification par IP IP - Avantage et utilisation IP
Plan
IFT1147
Programmation Serveur Web avec PHP
Authentification par adresse IP
Authentification HTTP
Authentification
htaccess
PHP
Authentification par formulaire HTML
Sans encryption
Avec encryption
HTTPS
IFT1147 - Authentification
2
Authentification par IP
Authentification par adresse 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
Une façon très simple d’authentifier
un groupe d’usagers
if ($_SERVER["REMOTE_ADDR"]== … )
IFT1147 - Authentification
IP - Avantage et utilisation
IP - problèmes
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
4
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.
5
IFT1147 - Authentification
6
1
Authentification HTTP
Authentification HTTP
Requête pour le document et réponse
qu’une authentification est nécessaire
Servons-nous des possibilités
incorporées au protocole HTTP
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
Le fichier .htaccess
Authentification HTTP
Le navigateur présente alors une boîte
de dialogue à l’usager et retourne
ensuite sa requête.
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 sousrépertoires.
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
9
Contenu de .htaccess
IFT1147 - Authentification
10
htpasswd
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.
IFT1147 - Authentification
8
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.
11
IFT1147 - Authentification
12
2
htaccess et htpasswd remarques
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
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.
13
htaccess et htpasswd désavantages
15
Et sans le fichier .htaccess
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
16
Authentification avec un formulaire
PHP permet d’envoyer des en-têtes
HTTP avec la fonction header().
À vous la puissance
et
l’obligation de défendre vos choix
de sécurité
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.
IFT1147 - Authentification
14
Authentification HTTP et PHP
Il n’est pas facile de créer un logout.
L’usager ne peut pas facilement luimê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
IFT1147 - Authentification
17
3
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
19
Première recette de vérification
21
Fonction à sens unique
IFT1147 - Authentification
20
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.
IFT1147 - Authentification
22
md5()
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
pourra pas les décrypter !
IFT1147 - Authentification
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.
Dangers de cette recette
$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
Login et mot de passe - BD
23
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
24
4
Authentification avec encryption
Deuxième recette de vérification
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
$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; }
}
25
Encore un peu plus de sécurité
26
Troisième recette de vérification
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
IFT1147 - Authentification
$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; }
}
27
md5() et MySQL
IFT1147 - Authentification
28
https
MySQL contient aussi une fonction md5()
Il est plutôt dangereux de changer la
recette précédente à
Et encore plus de sécurité …
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.
IFT1147 - Authentification
29
5
https
Certificats
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 !
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, celuici affiche un avertissement.
IFT1147 - Authentification
IFT1147 - Authentification
31
32
L’authentification est réussie …
Une fois passée l’étape de l’authentification, 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.
IFT1147 - Authentification
33
6