begin process at 2012 05 31 21:06:44
  Trouver un code source :
 
dans
 
Accueil > 

Tutoriels

 > 

Sécurité & Cryptage

 > INTÉGRATION D'UNE PROTECTION .HTACCESS À UNE AUTHENTIFICATION SÉCURISÉE PAR SESSIONS PHP-MYSQL

INTÉGRATION D'UNE PROTECTION .HTACCESS À UNE AUTHENTIFICATION SÉCURISÉE PAR SESSIONS PHP-MYSQL


 Information sur le tutoriel

Note :
Aucune note

 Description

Il est possible de sécuriser des pages web en utilisant un chiffrement des mots de passe par MD5 et les sessions PHP. Par ailleurs, il est également possible d'utiliser le système d'authentification .htaccess pour restreindre l'accès au contenu de répertoires spécifiques. Chacune de ces deux approches a ses avantages et ses inconvénients. D'où l'intérêt d'intégrer les deux méthodes.

L'objectif de ce tutoriel est de montrer comment utiliser une session PHP pour accéder à des pages se trouvant dans un répertoire protégé par un fichier .htaccess

Tutorial

 1. Mettre en place le système d'authentification par sessions PHP

De nombreux systèmes d'authentification par sessions PHP sont disponibles sur la toile. Utilisons par exemple le système DBProtect. Ce système est composé :

  • - d'une base de donnée MYSQL d'utilisateurs;
  • - d'une page index.php qui va gérer l'authentification des utilisateurs;
  • - d'une page accueil.php qui donne accès aux fonctionnalité de votre site aux utilisateurs dûment identifiés par index.php;
  • - d'une page admin.php qui est une interface permettant a l'administrateur d'ajouter ou de supprimer de nouveaux utilisateurs;
  • - d'un fichier connexion.php qui donne les paramètres de connexion à la base de donnée des utilisateurs.

2. Restriction d'accès d'un dossier par .htaccess

Soit, un dossier (par exemple le dossier /files/ ) contenant des fichiers qui seront rendus disponibles en téléchargement uniquement aux utilisateurs authentifiés par une session PHP. Ce dossier est protégé en y insérant un fichier .htaccess dont le contenu est le suivant :

								deny from all						

En conséquence, l'accès à ce dossier sera bloqué pour tout le monde...

3. Mettre en place un système de téléchargement par PHP des fichiers contenu dans le dossier restreint par .htaccess

Il faut maintenant permettre aux utilisateurs authentifiés par une session PHP de télécharger les fichiers du dossier /files/ dont l'accès est restreint par .htaccess. Cela peut s'envisager à l'aide d'un script PHP (download.php) qui va envoyer le contenu du fichier souhaité vers la sortie standard en utilisant la fonction fpassthru(). Pour ce faire, nous pouvons par exemple utiliser le code proposé sur le site Internet de Sebastian Sulinski :

Soit le script download.php contenant le code suivant :

						<?php
// block any attempt to the filesystem
if (isset($_GET['file']) && basename($_GET['file']) == $_GET['file']) {
   $filename = $_GET['file'];
}
else {
   $filename = NULL;
}
// define error message $err = '<p style="color:#990000">Sorry, the file you are requesting is unavailable.</p>';
if (!$filename) {
   echo "une erreur";
   // if variable $filename is NULL or false display the message
   
echo $err;
} else {
   // define the path to your download folder plus assign the file name
   $path = 'files/'.$filename;
   // check that file exists and is readable
   if (file_exists($path) && is_readable($path)) {
      // get the file size and send the http headers
      $size = filesize($path);
      header('Content-Type: application/octet-stream');
      header('Content-Length: '.$size);
      header('Content-Disposition: attachment; filename='.$filename);
      header('Content-Transfer-Encoding: binary');
      // open the file in binary read-only mode
      // display the error messages if the file can´t be opened
      $file = @ fopen($path, 'rb');
      if ($file) {
         // stream the file and exit the script when complete
         fpassthru($file);
         exit;
      } else {
         
echo $err;
      }
   } else {
      echo $err;
   }
}
?>

4. Permettre aux utilisateurs authentifiés par une session PHP de télécharger un fichier protégé par .htaccess

Il suffit pour cela d'insérer un lien vers le fichier souhaité dans la page d'accueil de l'utilisateur authentifié accueil.php :

						<a href="download.php?file=fichier1.pdf">Télécharger fichier1.pdf</a>				

5. Conclusion

Avec cette système, il est maintenant possible d'ouvrir un session PHP et de s'en servir pour accéder à des pages se trouvant dans un répertoire protégé par un fichier .htaccess

 

 Historique

04 mars 2010 10:57:51 :
-
04 mars 2010 11:07:25 :
Amélioration mise en forme
04 mars 2010 11:08:54 :
Amélioration de la mise en forme

Commentaires

Commentaire de circular le 27/03/2010 23:25:49

Intéressant

Commentaire de yopai_v le 21/04/2010 21:52:59

C'est clair et concis, mais à mon avis il faudrait attirer d'avantage l'attention sur les problèmes de sécurité que peut poser ce fonctionnement si l'on n'y prend pas garde.
Le script tel qu'il est écrit est protégé, mais un débutant pourrait prendre ce script, le modifier, et le rendre facilement vulnérable.

que se passe-t-il si l'on fait un
fpassthru('file/'.$filename);
et que $filename vaut '../../../../../../../../../../../etc/passwd' ?
le script renverra le fichier /etc/passwd (le fichier des mots de passe d'un serveur, qu'il est fortement déconseillé de rendre public !)
(Il y a beaucoup de ../ pour être sûr de se retrouver à la racine)

Le script se protège en effectuant, à la première ligne, un test (basename($x) == $x) - avec $x = $_GET['file'].
Pour moi, cela mériterait un commentaire imposant du type
/********************************
  ***** IMPORTANT - TEST DE SECURITE *****
  Il faut éviter de pouvoir accéder à un fichier comme /etc/passwd (si $filename = '../../../../../../../../../../../../etc/passwd')
  Pour cela, on n'accepte que les noms de fichier, sans spécification de répertoire.
*********************************/
if (basename($filename) != $filename) {
  $filename = null;
}

afin que ce test ne soit ni oublié, ni modifié.

Commentaire de marcmorel38 le 22/02/2012 19:57:09

J'ai testé le code et ça ne marche pas... Et, en y regardant de plus près, je ne vois pas en quoi le code du fichier dowmlaod.php teste la présence d'une variable de session. Pour moi, le code teste la présence du fichier, sa lisibilité et son accessibilité, et redirige le tout via un header, mais qu'il y ait ou non une session d'ouverte, je ne vois pas ce que ça change.

J'ai testé en créant une session (une page qui ne fait que créer les variables de session), puis en détruisant la session: ça ne change rien, le dossier reste invariablement inaccessible...

J'ai sans doute pas tout compris...

(j'ai EasyPHP 5.3.6.0 / Windows7 pro).

Merci.

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,172 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales