le 16/07/2007 à 09:51
jackbocar
Les pages du tuto :
Page 239
Les sessions
Chapitre 11
Pouvoir en restreindre l'accès aux utilisateurs identifiés et appartenant à une liste établie. Le site de votre client est hébergé chez un spécialiste sous la forme d'un hébergement mutualisé.
Pour créer un espace sécurisé, on fait généralement appel à une des deux méthodes suivantes :
• utilisation des contrôles d'accès intégrés au serveur web,
• utilisation d'une authentification gérée par l'application PHP via des sessions.
Dans notre cas, nous sommes dans le cadre d'un hébergement mutualisé et nous n'avons aucun moyen de modifier la configuration Apache, que ce soit de manière globale ou de manière locale (via des fichiers .htaccess).
La seule solution est donc l'utilisation des sessions PHP. Ces sessions vous permettent de garder trace de l'identification donnée par les gens et validée par vos soins. Nous allons donc créer un fichier permettant de s'identifier, un fichier permettant de valider les données soumises et un script de vérification de session. Ce dernier script sera inclus en haut de chaque page qui aura besoin d'être sécurisée.
Architecture du système.
Nous allons individualiser les trois scripts suivants et les utiliser comme le montre la figure 11-3 :
• auth.php: le formulaire pour s'identifier ;
• verif. php : le script vérifiant le couple pseudo/mot de passe et identifiant l'utilisateur ;
• secure. php : le script qui vérifie si l'utilisateur a accès à la ressource demandée.
Page 240
Le formulaire d'authentification : auth.php
Le formulaire d'authentification n'est a priori pas compliqué puisque, dans sa version la plus simple, deux champs suffisent : pseudo et mot de passe.
Le formulaire de validation : verif.php
L'utilisateur qui cherche à s'identifier nous fournit via la page précédente (auth.php) un pseudo et un mot de passe. Ces informations sont envoyées via la méthode POST et sont donc accessibles dans la superglobale $_P0ST[].
Nous allons donc vérifier que le couple pseudo/mot de passe proposé correspond bien à un couple existant. Si c'est le cas, une variable de session contenant le pseudo de l'utilisateur lui sera assignée. Celle-ci permettra de l'identifier.
Dans l'exemple, la fonction verificationO est une fonction imaginaire qui renvoie TRUE quand le mot de passe est le bon et FALSE dans le cas contraire ; à vous de la définir selon vos besoins.
La fonction verification()
Nous avons utilisé dans notre exemple précédent la fonction veri fi cati on () pour valider que le login est le mot de passe correspondent bien dans la base de données. Techniquement, c'est à vous d'implémenter cette fonction selon le schéma de base de données que vous utilisez, mais nous allons vous présenter ci-dessous un exemple minimal pour vous permettre une mise en place rapide.
La fonction veri fi cati on ( ) prend en argument un nom d'utilisateur et un mot de passe. La fonction renvoie TRUE si le nom d'utilisateur et son mot de passe correspondent à une entrée dans la base.
Nous allons considérer que nous avons une base de données nommée « application » et une table nommée « user » contenant les champs permettant l'authentification :
• identifiant : id_user
• nom d'utilisateur : login
• mot de passe non crypté (dans un cas réel utilisez toujours un mot de passe crypté, à l'aide de la fonction crypt() par exemple) : pass
Vérifiez que vous avez bien créé une base de données avec une base « application », que vous avez bien une table « user » contenant trois champs, dedans et incluez ce bout de code dans votre fichier verif.php pour que votre application fonctionne.
La page sécurisée : secure.php
Pour vérifier si l'utilisateur est déjà authentifié, nous allons lire cette variable dans le tableau de session $_SESSI0N[]. Si l'utilisateur est authentifié, alors la variable $_SESSION['nom'] existe. Dans le cas contraire, c'est que jamais l'utilisateur n'a fourni de mot de passe valide.
Il vous suffit maintenant d'ajouter includeCsecure.php') dans les scripts réservés pour que seules les personnes autorisées par la fonction verificationO puissent les utiliser. Les autres seront redirigées vers le formulaire d'identification.
Sécuriser encore plus votre application
Si vous souhaitez améliorer la sécurité de votre application, il convient d'utiliser des fonctions de chiffrement sur les mots de passe. Pour en savoir plus, consultez le chapitre 7, et notamment la partie concernant la fonction crypt().
Page 239
Les sessions
Chapitre 11
Pouvoir en restreindre l'accès aux utilisateurs identifiés et appartenant à une liste établie. Le site de votre client est hébergé chez un spécialiste sous la forme d'un hébergement mutualisé.
Pour créer un espace sécurisé, on fait généralement appel à une des deux méthodes suivantes :
• utilisation des contrôles d'accès intégrés au serveur web,
• utilisation d'une authentification gérée par l'application PHP via des sessions.
Dans notre cas, nous sommes dans le cadre d'un hébergement mutualisé et nous n'avons aucun moyen de modifier la configuration Apache, que ce soit de manière globale ou de manière locale (via des fichiers .htaccess).
La seule solution est donc l'utilisation des sessions PHP. Ces sessions vous permettent de garder trace de l'identification donnée par les gens et validée par vos soins. Nous allons donc créer un fichier permettant de s'identifier, un fichier permettant de valider les données soumises et un script de vérification de session. Ce dernier script sera inclus en haut de chaque page qui aura besoin d'être sécurisée.
Architecture du système.
Nous allons individualiser les trois scripts suivants et les utiliser comme le montre la figure 11-3 :
• auth.php: le formulaire pour s'identifier ;
• verif. php : le script vérifiant le couple pseudo/mot de passe et identifiant l'utilisateur ;
• secure. php : le script qui vérifie si l'utilisateur a accès à la ressource demandée.
Page 240
Le formulaire d'authentification : auth.php
Le formulaire d'authentification n'est a priori pas compliqué puisque, dans sa version la plus simple, deux champs suffisent : pseudo et mot de passe.
<html>
<head><title>Identification</title>
<head>
<body>
<form method="post" action="verif.php">
<P>
<label for="nom">Pseudo : </label>
<input type="text" name="pseudo">
</p>
<P>
<label for="motdepasse">Mot de passe : </label>
<input type="password" name="motdepasse">
</p>
<P>
<input type="submit" value="s'identifier">
</P>
</form>
</body>
</html>
Le formulaire de validation : verif.php
L'utilisateur qui cherche à s'identifier nous fournit via la page précédente (auth.php) un pseudo et un mot de passe. Ces informations sont envoyées via la méthode POST et sont donc accessibles dans la superglobale $_P0ST[].
Nous allons donc vérifier que le couple pseudo/mot de passe proposé correspond bien à un couple existant. Si c'est le cas, une variable de session contenant le pseudo de l'utilisateur lui sera assignée. Celle-ci permettra de l'identifier.
Dans l'exemple, la fonction verificationO est une fonction imaginaire qui renvoie TRUE quand le mot de passe est le bon et FALSE dans le cas contraire ; à vous de la définir selon vos besoins.
<?php
// initialisation de la session ;
session_start() ;
//si on a reçu les données d'un formulaire :
if ( isset( $_P0ST['pseudo'] ) && isset ( $_POST['motdepasse'] ) ) {
//on les récupère
$nom = $_P0ST['pseudo'] ; $motdepasse = $_POST['motdepasse'] ;
//on teste si le mot de passe est valide :
if ( verificationt $nom, $motdepasse ) ) {
//Page 241
//le mot de passe est valide, l'utilisateur est identifié
// on change d'identifiant de session
session_regenerate_id() ;
// on sauvegarde donc son nom dans la session
$_SESSI0N['nom'] = $nom ;
$message = 'vous êtes correctement identifié' ;
}else {
// sinon on avertit l'utilisateur : | Smessage = 'Mauvais mot de passe' ;
$message .='<a href="auth.php">retour</a>' ;
} else {
// un des champs n'est pas rempli
$message 'le login ou le mot de passe est vide' ;
$message .='<a href="auth.php">retour</a>' ;
}
?>
<html>
<head><title>Identification</title>
</head>
<body>
<p>
<?php echo $message ?>
</p>
</body>
</html>
La fonction verification()
Nous avons utilisé dans notre exemple précédent la fonction veri fi cati on () pour valider que le login est le mot de passe correspondent bien dans la base de données. Techniquement, c'est à vous d'implémenter cette fonction selon le schéma de base de données que vous utilisez, mais nous allons vous présenter ci-dessous un exemple minimal pour vous permettre une mise en place rapide.
La fonction veri fi cati on ( ) prend en argument un nom d'utilisateur et un mot de passe. La fonction renvoie TRUE si le nom d'utilisateur et son mot de passe correspondent à une entrée dans la base.
Nous allons considérer que nous avons une base de données nommée « application » et une table nommée « user » contenant les champs permettant l'authentification :
• identifiant : id_user
• nom d'utilisateur : login
• mot de passe non crypté (dans un cas réel utilisez toujours un mot de passe crypté, à l'aide de la fonction crypt() par exemple) : pass
<?php
function verification($nom,$pass){
//connexion SQL
$dbhote = 'localhost';
$dbuser = 'root';
$dbpass ='monpass' ;
$dbbase = 'application' ;
$dsn = "mysql:dbname=$dbbase;host=$dbhote" ;
$dbh = new PDO($dsn, $dbuser, $dbpass);
//création de la requête SQL
$nom_sql = $dbh->quote($nom) ;
$pass_sql = $dbh->quote($pass) ;
$sql ="SELECT count(*) as nbres FROM user "
. " WHERE login=$nom_sql AND pass=$pass_sql ";
//exécution de la requête SQL
$result = $dbh->query($sql);
$row = $result->fetch();
$result = null ;
if($row['nbres'] == 1){
return TRUE;
}else{
return FALSE;
?>
Vérifiez que vous avez bien créé une base de données avec une base « application », que vous avez bien une table « user » contenant trois champs, dedans et incluez ce bout de code dans votre fichier verif.php pour que votre application fonctionne.
La page sécurisée : secure.php
Pour vérifier si l'utilisateur est déjà authentifié, nous allons lire cette variable dans le tableau de session $_SESSI0N[]. Si l'utilisateur est authentifié, alors la variable $_SESSION['nom'] existe. Dans le cas contraire, c'est que jamais l'utilisateur n'a fourni de mot de passe valide.
<?php
session_start() ;
//on vérifie si l'utilisateur est identifié
if ( !isset( $_SESSION['nom'] )) {
//la variable de session n'existe pas,
//donc l'utilisateur n'est pas authentifié
//on redirige sur la page permettant de s'authentifier
header('Location: auth.php') ;
//on arrête l'exécution
exit() ;
?>
Il vous suffit maintenant d'ajouter includeCsecure.php') dans les scripts réservés pour que seules les personnes autorisées par la fonction verificationO puissent les utiliser. Les autres seront redirigées vers le formulaire d'identification.
Sécuriser encore plus votre application
Si vous souhaitez améliorer la sécurité de votre application, il convient d'utiliser des fonctions de chiffrement sur les mots de passe. Pour en savoir plus, consultez le chapitre 7, et notamment la partie concernant la fonction crypt().