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