Le but de cet article est de proposer une solution en PHP pour sécuriser l’accès a un contenu volumineux. En effet l’accès a un contenu de taille réduite, comme du texte peu se faire facilement par l’intermédiaire d’une base de donnée ou tout simplement directement dans le code PHP. S’il s’agit de quelques photos il est également possible de les stoker dans une base de donnée, mais quand il s’agit de plusieurs centaines de photos ou des vidéos, je pense qu’il est plus judicieux de fonctionner différemment et donc je vais vous proposer une solution.

Attention, la méthode que je décris ici s’applique seulement dans le cas précis où l’utilisateur doit avoir accès à un contenu pendant une certaine durée, même si le contenu source est modifié ou supprimé ! Dans tout les autre cas, il est plus judicieux d’utiliser la fonction readfile() associé a l’envoie de headers appropriés (la méthode est décrite dans l’article de Boun PHP : download sécurisé de fichiers).

Dans le principe, nous allons utiliser deux dossiers :

  • Le premier servira à stoker les données de manière permanentes sans qu’elles soient accessibles depuis l’extérieur
  • Le second servira à stoker les données de manière temporaire. Quand un utilisateur voudra visionner le contenu, s’il a le droit d’y accéder, les données demandées seront copié depuis le dossier de stockage vers le dossier temporaire.

Pour protéger les données du premier dossier que nous allons appeler ‘stockage’, nous avons plusieurs solutions. Nous pouvons protéger le dossier à l’aide d’un fichier .htaccess par exemple, mais la meilleurs solution reste surement de placer le dossier en dehors de l’arborescence de votre site (en dehors de votre dossier www). Attention, il faut toutefois que PHP puisse y accéder.
Le second dossier que nous allons appeler ‘dossier_temporaire’ doit par contre être dans l’arborescence de votre site.
Pour sécuriser l’accès, vous pouvez utiliser une authentification par login et mot de passe, mais on peut aussi imaginer l’utilisation d’allopass dans le cas d’accès payant. Pour cette partie, je vous laisse choisir votre méthode.
Une fois que vous aurez choisi votre manière de fonctionner, nous allons voir comment nous allons procéder pour copier toutes les données depuis le dossier de stockage vers le dossier temporaire.

$str = 'abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ';
do{	// cette boucle permet de prévenir l'improbable chance que la génération aléatoire sorte un nom de dossier déjà existant.
	$nom_dossier = '';
	for ($i=0; $i<20; $i++) {
		$nom_dossier.= $str{rand(0,61)};
	}
}while(file_exists('/home/votre-dossier/www/dossier_temporaire/'.$nom_dossier));
mkdir('/home/votre-dossier/www/dossier_temporaire/'.$nom_dossier, 755);	// ici à vous d'ajuster les droits suivant vos besoins
 
$list_fichiers = scandir('/home/votre-dossier/stockage/');
$list_fichiers = array_slice($list_fichiers, 2);	// cela permet de supprimer les deux dossiers '..' et '.'
foreach($list_fichiers as $fichier){
	copy('/home/votre-dossier/stockage/'.$fichier, '/home/votre-dossier/www/dossier_temporaire/'.$nom_fichier);
}

Dans le code je vous conseille d’utiliser que des liens absolut pour éviter tout problème lié au positionnement des dossiers. (je l’ai appelé ici par ‘/home/votre-dossier/’ qu’il faudra que vous remplaciez pour ce qui convient suivant votre serveur.)

Maintenant toutes les données demandées sont accessible pour autant qu’on connaisse le nom du dossier composé de 20 caractères aléatoire. Si vous avez besoin de visionner le contenu de ce dossier sur plusieurs pages, il faudra faire suivre dans toutes les pages le nom de ce dossier. Pour cela vous avez le choix, vous pouvez le faire passer par les variables GET, POST, SESSION ou COOKIE.
Il reste cependant un problème, c’est qu’au fur et a mesures que les gens vont accéder aux données, la taille du dossier ‘dossier_temporaire’ vas augmenter jusqu’à prendre toute la place disponible sur le disque il va donc falloir vider ce dossier régulièrement. Pour cela nous pouvons par exemple utiliser le script PHP suivant :

Une fois que vous avez créer ce fichier il faudra lancer sont exécution régulièrement. Si ce n’est pas trop important et que vous êtes sur de ne pas l’oublier, vous pouvez le lancer par vous-même, mais le mieux reste quand même de le lancer a partir de crontab.
Sous Linux pour modifier les cron :

$ contab –e

A la suite des éventuelles commandes que vous avez, il faut ajouter :

Minutes(0-59) Heure(0-23) Jour-du-mois(1-31) Mois(1-12) Jour-de-la-semaine(0-6 avec 0=Dimanche) wget –O /home/votre-dossier/resultat_cron  http://www.nom-de-domaine/nom-du-fichier-a-executer.php

(Après wget, il s’agit d’un o majuscule)

Par exemple si vous voulez lancer le script tout les jours à 3h du matin il faut mettre:

0 3 * * * wget –O /home/votre-dossier/resultat_cron  http://www.nom-de-domaine/nom-du-fichier-a-executer.php

Pour vérifier que la cron a bien été ajouté, tapez la commande:

$ crontab –l

Et si votre cron a bien été ajouté, elle devrait apparaitre.

Et voilà, votre contenu ne sera accessible qu’au détenteur du nom de dossier pendant la durée que vous aurez défini avec très peut de chance que quelqu’un trouve le nom puisqu’il est composé de 20 caractères tiré au hasard.

3 commentaires

  • PHP : download sécurisé de fichiers | LE GLOB DE BARGEO, le 8 avril 2009

    [...] article est une réponse « Créer un accès sécurisé en PHP pour un contenu volumineux » de Johan. Je propose ici une autre méthode pour sécuriser le téléchargement de tout type de [...]

  • Boun (4 comments), le 8 avril 2009

    Bonjour Johan,

    J’ai posté un message sur le même sujet en réponse au tiens. Pour quelqu’un qui voudrait utiliser cette méthode, il est possible, plutôt que de faire une copie du fichier de créer un lien symbolique vers celui-ci. Ainsi pas besoin d’espace disque supplémentaire !

  • Johan (38 comments), le 8 avril 2009

    Merci pour la précision. Je viens d’éditer mon article pour expliquer dans quel cas utiliser ma méthode qui est en effet peut adapté la plus part du temps.

Poster un commentaire

Subscribe without commenting