Protéger le répertoire IMG/

Voici un script permettant protéger le contenu du répertoire IMG/

Pourquoi cette contrib ?

Dans le cas d’un intranet, il peut être utile de vouloir restreindre l’accès aux pièces jointes des articles ou des rubriques uniquement aux personnes autorisées à se connecter au site. (Cf : #LOGIN_PUBLIC et #URL_LOGOUT)

Spip stocke l’ensemble des documents (publiés ou non) dans le répertoire IMG/ . N’importe qui peut consulter ces documents (images, fichiers pdf, word...) en allant à l’adresse http://www.votresite.com/IMG/ ou en connaissant l’url d’un document. Cette contrib permet donc de corriger ce problème et de restreindre l’accès à vos données.

I. Ne pas lister le contenu des répertoires

La première chose à faire est d’empêcher Apache de lister le contenu des répertoires ne contenant pas de fichier « index ». Pour cela, il faut placer un fichier nommé .htaccess à la racine de votre site. Ce fichier doit contenir les lignes suivantes :

ErrorDocument 404 erreur404.php3
options -indexes


-  La première ligne permet de rediriger l’internaute lorsque la page demandée n’existe pas. Pour cela, vous devez créer un squelette d’erreur (couples de fichier erreur404.php3/erreur404.html)
-  La deuxième ligne empêche Apache de lister le contenu des répertoires ne possédant pas de fichier « index »
-  Ces règles s’appliquent au répertoire racine et à ses sous-répertoires.

II. Protéger le répertoire IMG/

1. - Créer un fichier .htaccess à la racine du répertoire IMG/ contenant les instructions suivantes

ErrorDocument 404 ../erreur404.php3

<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteRule "\.(doc|pdf|sxw|ppt|ps|txt|xls|html|DOC|PDF|SXW|PPT|PS|TXT|XLS|HTML)$" ../securedoc.php3
</IfModule>

<IfModule !mod_rewrite.c>
        <IfModule mod_access.c>
                <Files ~ "\.(doc|pdf|sxw|ppt|ps|txt|xls|html|DOC|PDF|SXW|PPT|PS|TXT|XLS|HTML)$">
                        Deny from all
                        ErrorDocument 403 ../securedoc.php3
                </Files>
        </IfModule>
</IfModule>


-  Pour info : Afin de ne pas trop surcharger le serveur, les fichiers protégés sont uniquement les fichiers : doc, pdf, sxw, ppt, ps, xls, html et txt. Si vous voulez protéger d’autres types de fichiers, vous devez rajouter des extensions (ex : gif, jpg...).

2. - Créer le fichier securedoc.php3 à la racine de votre site.

<?php

include("ecrire/inc_version.php3");


function not_found() {
	http_status(404);
	Header("Location: erreur404.php3");
	exit;
}

$uri = $REQUEST_URI;

if ($HTTP_COOKIE_VARS['spip_session'] OR ($PHP_AUTH_USER AND !$ignore_auth_http)) {
	include_ecrire ("inc_session.php3");
	if (verifier_visiteur()){
	
		
		if (!ereg("/IMG/",$uri) || !ereg("..",$uri)){
			not_found();
		}
	
		$fichier = preg_replace(",^.*/IMG/,", "IMG/", $uri);
		if (!@file_exists($fichier) || !@is_file($fichier)){
			not_found();
		}
		
			
		$size = @filesize($fichier);
		if (!$size){
				not_found();
		}
		
		
		$if_modified_since = ereg_replace(';.*$', '', $HTTP_IF_MODIFIED_SINCE);
		$gmoddate = gmdate("D, d M Y H:i:s", @filemtime($fichier))." GMT";
		if ($if_modified_since == $gmoddate) {
			http_status(304);
			exit;
		}
		http_status(200);
		
		$nom=ereg_replace(".*/","",$fichier);
		$extension=ereg_replace("^(.*)\.(.*)$", "\\2", $nom);
		$req= "SELECT mime_type FROM spip_types_documents WHERE extension='".$extension."'";
		$res = spip_query($req);
		if (spip_num_rows($res)>0){
			$row = spip_fetch_array($res);
			$mimeType = $row['mime_type'];
			Header('Content-Type: '.$mimeType);
		}
	
		Header("Content-Length: ".$size);
		Header("Last-Modified: ".$gmoddate);	
		Header('Content-Disposition: attachment; filename="'.$nom.'"');
		
		readfile($fichier);
	}
	else {
		not_found();
	}
}
else {
	not_found();
}


?>

3. - Exécuter le script SQL suivant qui va compléter les champs mime_type de la table spip_types_documents qui par défaut sont vides.

script SQL

III. Comment çà marche ?


-  Le fichier « IMG/.htaccess » redirige les demandes de documents de l’internaute vers le fichier « securedoc.php3 »
-  Le script « securedoc.php3 » vérifie si l’internaute est connecté. Dans ce cas, le script effectue plusieurs vérifications (Est-ce que le fichier existe ; Est ce que sa taille est supérieure à 0...). Enfin, il récupère le type mime du document, complète les en-têtes http de la page et retourne le document à l’internaute.
-  Dans le cas inverse, une erreur 404 est retournée au navigateur.

IV. L’archive de la contrib

Protéger le répertoire IMG/ (Authentification)
Cette version impose à l’utilisateur d’être connecté.
Protéger le répertoire IMG/ (Referer)
Cette légère variante n’impose pas d’authentification, mais teste la présence d’un referer. Attention les navigateurs ne retournent pas toujours le referer de la page consultée. Ce qui peut poser des problèmes dans certains cas

-  Ce script est très inspiré de celui d’Antoine publié sur la liste de diffusion spip-devel.

Discussion

Aucune discussion

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom