lundi 1 avril 2013

Protéger une page avec les sessions php

Depuis la version 4.1.0 de PHP, on utilise la variable $_SESSION pour récupérer ou gérer tout les variables de session.
On s'en sert très souvent pour faire un accès sécurisé.
Voici un rapide exemple de comment rendre une page accessible que via login et mot de passe.

Tout d'abord, le formulaire html ou l'on va entrer le login et mot de passe (form.html)
<p>Formulaire de connexion</p>
<form action="./identification.php" method="post">
    Login : <input type="text" name="login" value="" /><br />
    Login : <input type="password" name="mdp" value="" /><br />
    <input type="submit" value="envoyer">
</form>


Puis, une page config.php dans lequel on va stocker le login et mot de passe de l'administrateur :
<?php
$salt = 'BwGk15l8WX'; // $salt permet d'avoir un mot de passe plus sécurisé
$_admin_pass = md5('motdepasse'.$salt); // on crypt pour pouvoir comparer - plus sécurisé
$_admin_login = 'login';
?>


Ensuite, la page qui va vous identifier : (identification.php)
<?php
session_start(); // on initialise les sessions PHP

// on inclu la page de config
include("./config.php");

if($_POST && !empty($_POST['login']) && !empty($_POST['mdp']))
{
    // on crypt le mot de passe envoyer par le formulaire
    $password_md5 = md5($_POST['mdp'].$salt);

    if(($_admin_login == $_POST['login']) && ($password_md5 == $_admin_pass))
    {
        $_SESSION['_login'] = $_admin_login;
        $_SESSION['_pass'] = $password_md5;

        echo '<p style="color:green">Connexion réussi! </p>';
        echo '<p><a href="./index.php">Page admin</a></p>';
    }
    else
    {
        echo '<p style="color:red">Mauvais login ou mot de passe</p>';
        include("./form.html");
        exit();
    }
}
?>


Ensuite, il faut un code php qui va vérifié, sur chaque page que vous voulez protéger, que nous sommes bien connecté : (verif.php)
<?php
session_start();

// on inclu la page de config
include("./config.php");

if(!isset($_SESSION['_login']) || !isset($_SESSION['_pass']))
{
    // si on ne détecte aucune sessions, c'est que cette personne n'est pas connecté
    // on affiche le formulaire de connexion
    echo '<p><b style="color:red">espace sécurisé</b><br />Connecté vous pour accéder à cette page</p>';
    include("./form.html");
    exit();
}
else
{
    // les sessions existe ... reste à savoir si les informations sont correct ou non
    if(($_admin_login != $_SESSION['_login']) || ($_SESSION['_pass'] != $_admin_pass))
    {
        echo '<p><b style="color:red">Votre connexion ne semble pas valide</b></p>';
        include("form.html");
        exit();
    }
}
?>


Pour finir, il faut une 1er page qui test si on est connecté ou non et qui affichera la page (ou une liste de page protégé). Appelons cette 1er page index.php :
<?php
include('./verif.php'); // si la vérification est ok : on aura accès au reste de la page.

echo '
<p>
    <b>Bonjour</b><br />
    Vous est connecté en tant que <b>'
.$_SESSION['_login'].'</b>
</p>'
;
?>


Ceci est vraiment un exemple assez basique de comment créer un petit espace protéger par login et mot de passe unique. Le système d'identification peut et devrai être améliorer dans un univers en production. On est dans un cadre d'apprentissage.

1 commentaire:

  1. Bonjour,
    A priori la vérification des champs vides de ton fichier identification.php ne fonctionne pas car si on valide le formulaire alors qu'aucun champs n'est rempli le message d'erreur ne s'affiche pas. Dommage ! ;-(

    RépondreSupprimer