enfin un article sur la sécurité informatique
digne de ce nom ;) En effet, je vais vous exposer dans cet article la technique
de protection de vos pages web, notamment utilisées pour les parties membres
ou d'administration. Il s'agit des sessions en php4
Tout d'abord, il
faut comprendre les sessions, c'est un procédé à part entière qui utilise
ses propres variables pouvant être enregistrées uniquement lors de l'activation
des sessions.
Toute la sécurité se situe au niveau des variables, le
principe est simple : lors de l'authentification, on vérifie les login et pass,
et si l'auth est correcte, on enregistre une variable session qui pourra contenir
ce que l'on veut. Sur une page protégée, il suffira simplement de vérifier si
la variable session que l'on a choisi est existe (enregistrée) ce qui signifiera
que l'authentification a été faite ou pas. Les sessions php4 se distinguent
des sessions php3 par l'absence de cookie. En effet, les données seront stockées
sur le serveur (base de données), dans une zone généralement réservée aux sessions.
Lors de l'activation d'une session, un identifiant appelé "id session"
sera mis en mémoire, c'est cette idée qui permettra de reconnaitre ou non la
session en cours.
Passons maintenant à la pratique. Tout d'abord,
activons la session :
<? session_start(); ?>
Ce
code doit se trouver tout en haut de chaque page sous peine de faire
planter le script. Meme un simple commentaire html se trouvant avant se code
pourrait tout faire planter.
Enregistrons maintenant une variable session
qui contiendra par exemple l'id session.
<? session_start();
//activation
de la session $id = $PHPSESSID; //
on définit l'id dans une variable standard session_register("id");
// On enregistre
$id dans une variable session ?>
On
peut vérifier si la variable "id" est enregistrée, pour cela, il suffit
d'utiliser session_registered() : <? session_start();
if(session_registered("id")) { echo "Variable \$id sauvegardée !"; } else { echo "Variable \$id non sauvegardée !"; } ?>
Voici
comment mettre fin à une session : Nous pouvons faire plusieurs actions :
désenregistrer une ou toutes les variables sessions, ou bien directement détruire
la session.
<? session_unregister("id"); //
on supprime la variable session "id" session_unset(); //
on désactive toutes les variables sessions. session_destroy(); //
on détruit complètement la session. ?>
Nous avons maintenant tous
les éléments pour créer une page protégée...
Script d'authentification
que nous appellerons "auth.php", on y aurra accès après avoir rempli
le formulaire login et pass . On vérifiera dans le champ "access"
de la base sql s'il est égal à "ok". Cette option permettra par exemple
de suspendre un compte utilisateur sans le supprimer.
--------------- <? session_start();
//
démarrage de la session $login = $_POST['login']; $pass = $_POST['pass']; if(isset($login)
&& isset($password)) //
on vérifie si on est passé par le formulaire { mysql_connect("host",
"login", "pass"); //
connexion à la base sql # On vérifie si "access" est égal à "ok"
dans la base $req=mysql_db_query("nom_base", "select access from
base where nom = '$login' and pass = '$pass'"); // on regarde
à l'endroit des login et pass $result=mysql_fetch_object($req) or die("Login
ou pass incorrect !"); //
si le login et le pass ne sont pas trouvés, on arrète le script $access=$access->access;
//
on met l'access dans une variable $access $id=$nom; if($access
!= "ok") //
On vérifie la valeur de la variable $access { echo
"Compte désactivé !"; exit();
//
On arrète le script } else { session_register("access_ok");
//
si on a passé toutes les étapes, on enregistre la variable session "access_ok" } mysql_close();
//
on ferme la connexion mysql } if (!session_is_registered("access_ok"))
//
si la variable n'est pas enregistrée... { echo"<center>Session
expirée ou invalide !<br>"; echo"<a
href='url_du_formulaire'>reconnexion</a></center>"; exit(); } ?> <html>
/.........../
//
Accès à la page html protégée par la session
</html> ---------------------
Maintenant
que nous avons notre script d'authentification, il suffit d'établir le code
de protection qui se trouvera en haut de chaque page qui nécessitera un login
et un pass. Il suffira pour cela de vérifier si la variable session que nous
avons appelé "access_ok" est enregistrée ou non.
----------------- <? session_start(); if
(!session_is_registered("access_ok")) //
si la variable n'est pas enregistrée... { echo"<center>Session
expirée ou invalide !<br>"; echo"<a
href='url_du_formulaire'>reconnexion</a></center>"; exit(); } ?> <html> /..../
//
Page html protégée. </html> -------------------
Une
note importante à signaler, est que lorsque l'on navigue dans des pages via
des liens hypertextes utilisant les sessions, il est nécessaire de mettre
le nom de session et l'id dans cette url afin de garder en mémoire l'id session
actif pour ne pas avoir besoin de se réidentifier à chaque page protégée.
Exemple : http://site.com/membre.php?<?
echo $session_name; ?>=<? echo $PHP_SESSID; ?> ce qui donnera lors
de l'éxécution : http://site.com/membre.php?PHP_SESSID=7d5d7h4fvn2bnhj45fg9dgz "7d5d7h4fvn2bnhj45fg9dgz"
correspondant à l'id session.
En conclusion, les sessions php4 sont
légères, éfficaces et sécurisées par rapport aux sessions php3 Cet article
est bien entendu une simple présentation des sessions php4 par un exemple, car
elle offrent beaucoup plus de possibilités, on peut par exemple les utiliser
en situant les visiteurs n'importe où sur le site, il suffit pour cela d'enregistrer
dans une variable session le nom de la page courant. On peut très bien les utilser
pour établir des stats détaillées d'un site web en pistant les visiteurs sur
le site. On pourra également ajouter une sécurité sur ce script afin d'éviter
les vols de sessions, en effet si on vous prends votre id session en exploitant
une petite faille XSS, on pourra utilser votre compte si votre session est encore
active : pensez à vous déconnecter de la session ! Pour éviter le vol de session,
on enregistrera dans une variable session l'ip utilisée lors de l'authentification
et on vérifiera ensuite l'ip contenue dans la variable avec l'ip actuelle sur
chaque page. ($REMOTE_ADDR pour afficher l'ip)
J'espère que cela
vous sera utile, soit pour mieux comprendre les techniques de sécurité, soit
pour établir votre compte membre sur votre site web...