PHP- Authentification avec MySQL – Session
Sommaire
I. Présentation
Dans ce tutoriel, nous allons apprendre à protéger notre base de données grâce à une authentification avec les outils MySql et la fonction Session en PHP (cette fiche).
Le principe de la session PHP permet de sauvegarder des données inter-pages. Grâce à ceci, nous comparerons les données recueillies avec la liste des User enregistrés dans MySql et leur mot de passe pour vérifier que la session existe et est valable et L’utilisateur est correctement authentifié et le couple Login/Mot de passe existe.
Nous commençons par un formulaire d’identification simple en HTML qui enverra les données à une page qui commencera la session et enregistrera les données reçu dans cette session.
II. La page index.html
Nous entrons le code suivant dans l'index.html :
<FieldSet> <FORM action="VerifId.php" method=POST> <Legend> Identification</Legend> <INPUT Type=Test Name="Login" placeholder="Login" required> <INPUT Type=Test Name="Password" placeholder="Passord" required> <INPUT Type=SUBMIT Value="Log !"> </FORM> </FieldSet>
II. La page VerifId.php
Le fichier VerifId.php aura pour but de débuter la session php et de mettre dans cette session les paramètres entrés par l'utilisateur (Login et password):
<?php session_start(); $_SESSION['Login']=$_POST['Login']; $_SESSION['Password']=$_POST['Password']; HEADER('Location:Liste.php'); ?>
III. Problème
Pourquoi une page pour simplement démarrer une session ?
Cela est une sorte de sécurité, en effet, en théorie, rien n’empêche l’utilisateur de directement se connecter en tapant l’URL de la page d’accueil du site une fois loguer ( URL: SiteWeb.php?\Liste.php).
La session sera démarrée, mais aucune valeurs ne seront dans ‘Login’ et ‘ Password’. Ainsi, grâce à une simple vérification des variables ‘Login’ et ‘Password’ comme vide, Nous saurons si la session est en règle.
Alors qu’en passant par cette page ( avec la méthode de transmission POST qui cache les variables passées ), nous pourrons affecter les données à la session et ainsi s’assurer que la session est en règle.
Le HEADER permet de rediriger l’utilisateur une fois que la page a été lu, ainsi cette page est transparente a l’utilisateur.
IV. Vérification de la session
<?php // Démarrage de la session session_start(); // On vérifie si le champ Login n'est pas vide. if ($_SESSION['Login']=='') // Si c'est le cas, le visiteur ne s'est pas loger et subit une redirection { Header('Location:index.html'); } else { echo " <a href src='Disconnect.php'> Se déconnecter </a> || Utilisateur: ". $_SESSION['Login'] .""; } // Test De vérification que l'user est bien dans la liste des utilisateurs Mysql // Connexion à la base de données MySql $DataBase = mysql_connect ( "localhost" , 'root' , '' ) ; // Cette table contient la liste des users enregistrés. mysql_select_db ( "mysql" , $DataBase ); // Nous allons chercher le vrai mot de passe ( crypté ) de l'utilisateur connecté // Cryptage du mot de passe donné par l'utilsateur à la connexion par requête SQL $Requete ="Select PASSWORD('".$_SESSION['Password']."');"; $Resultat = mysql_query ( $Requete ) or die(mysql_error() ) ; while ( $ligne = mysql_fetch_array($Resultat) ) // Le vrai mot de passe crypté est sauvergardé dans la variable $RealPasswd {$RealPasswd=$ligne["PASSWORD('".$_SESSION['Login']. "')"];} // Initialisation à Faux de la variable "L'utilisateur existe". $CheckUser=False; // On interroge la base de donnée Mysql sur le nom des users enregistrés $Requete ="Select Password,User From user"; $Resultat = mysql_query ( $Requete ) or die(mysql_error() ) ; while ( $ligne = mysql_fetch_array($Resultat) ) { // Si l'utilisateur X est celui de la session if ( $ligne['User']==$_SESSION['Login']) { // Alors on vérifie si le mot de passe est le bon If ($RealPasswd == $ligne['Password']) // Si le couple est bon, c’est que l’utilisateur est le bon. {$CheckUser=True;} } } // Si l'utilisateur n'est toujours pas valide à la fin de la lecture tableau if ( $CheckUser==False ) // Redirection vers la fenêtre de connexion. {Header('Location:index.html');} ?>
Cela peut être couplé avec l’utilisation des droits sur les bases de données MySQL, nous pourrons créer des utilisateurs capables de voir, mettre à jour, supprimer, insérer certaines tables et pas d’autres.
Quelques petites remarques:
* Tu utilises le compte root pour te connecter à ta base mysql ce qui est une mauvaise pratique, surtout que (cf le point 2) si tu as une faille SQL, toutes tes bases seront vulnérables. Le mieux est de créer pour chaque base un compte de consultation et un autre d’administration qui seront munis de droits restreints.
* Gros soucis: à aucun moment tu ne filtres les données utilisateurs, ce qui fait que le script est super vulnérable aux injections SQL…
* La doc mysql (https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_password ) indique qu’il vaut mieux éviter d’utiliser la fonction PASSWORD et d’utiliser la fonction SHA2 à la place. D’ailleur, comme évoqué dans cette même page, sous certaines circonstances, le résultat peut être loggué en clair dans un fichier .mysql_history
* Pourquoi stocker dans session le mot de passe (en plus en clair) ? (idem pour le login) Celui sera ainsi dispo durant toute la session. Il vaudrait mieux faire la vérif une fois et stocker un drapeau $_SESSION[‘conn’] booléen indiquant si la personne est connectée ou pas.