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

16 discussions

  • 2

    Bonjour,

    pour protéger le répertoire IMG et d’autres sur mes sites, j’utilise une astuce empruntée à l’équipe PIWIGO ( Site PIWIGO) qui utilise un fichier index.php positionné dans chacun des répertoires à protéger. Lors d’une demande d’accès au répertoire protégé, le fichier index vous renvoi vers la page d’accueil de votre site et les documents utilisés dans vos articles, rubriques, brèves, etc ... restent disponibles pour SPIP.

    Voir en ligne (Site chez FREE) : Latoniccia Club Plongée/IMG

    Code du fichier Index.php :

    <?php
    // +-----------------------------------------------------------------------+
    // | PhpWebGallery - a PHP based picture gallery                           |
    // | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
    // | Copyright (C) 2003-2005 PhpWebGallery Team - http://phpwebgallery.net |
    // +-----------------------------------------------------------------------+
    // | the Free Software Foundation                                          |
    // |                                                                       |
    // | This program is distributed in the hope that it will be useful, but   |
    // | WITHOUT ANY WARRANTY; without even the implied warranty of            |
    // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
    // | General Public License for more details.                              |
    // |                                                                       |
    // | You should have received a copy of the GNU General Public License     |
    // | along with this program; if not, write to the Free Software           |
    // | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
    // | USA.                                                                  |
    // +-----------------------------------------------------------------------+
    
    // recursive call of index.php
    
    $url = '../index.php';
    header( 'Request-URI: '.$url );
    header( 'Content-Location: '.$url );
    header( 'Location: '.$url );
    exit();
    ?>
    • merci pour cette astuce, ça marche nickel chrome même pour la dernière version de Spip. Depuis le temps que je cherchais un système simple et efficace.... Sympa de l’avoir partagé

    • Roger Bunivot

      Bonjour, désolé de déterrer ce vieux sujet, je n’y connais rien en php. J’essaye tant bien que mal de maintenir un site web avec SPIP.
      Je suis très intéressé par votre script.
      J’ai fais un copié collé de votre script dans un fichier que j’ai nommé index.php, j’ai copié le fichier dans le dossier IMG de mon site, y-a-t-il une autre chose à faire, car pour l’instant j’ai toujours accès à la liste des fichiers présent dans le dossier IMG et aucune redirection ne s’effectue.
      J’utilise spip 2.07 et le site est hébergé chez free.

    Répondre à ce message

  • Voilà une solution que j’applique et qui fonctionne

    -  1/ créer IMG/.htaccess contenant :
    SetEnvIf Referer « ^http:\/\/xxx\.mon-domaine\.fr » OK
    Order Deny,Allow
    Deny from all
    Allow from env=OK

    -  2/ modifier conf/httpd.conf :
    DocumentRoot « /usr/local/xxx/htdocs »
    AccessFileName .htaccess
    ...

    ...
    AllowOverride All


    -  3/ recharger apache

    Répondre à ce message

  • Bonjour.
    Même problème que certain, impossible d’exécuter le sript SQL (dernière étape du tuto), du coup je n’ai plus accès aux fichiers déposé sur le site.
    Pourriez-vous détailler l’installation du script ?
    Merci d’avance.
    Phil

    Répondre à ce message

  • 2

    Bonsoir,
    Il y a un truc qui ne va pas :
    Je suis sur spip2.1.8 sur ovh, et j’ai essayé toutes les manips de la contrib ainsi que celles du forum en prenant soin de remplacer les php3 par php, et ajouter include(« ecrire/inc/headers.php ») ; sous include(« ecrire/inc_version.php ») ;

    IMG et sous répertoires sont bien inaccessibles, mais on peut encore accéder aux fichiers directement par l’url.

    ici on parle beaucoup de spip1.9 mais qu’en est-il de spip2 pour ces scripts ?

    • Bonjour,
      j’utilise SPIP 2.1.8 et le système de protection de répertoire à base d’un fichier index.php présent dans le répertoire IMG. Cela fonctionne correctement. Ce fichier renvoi vers la page d’accueil du site si quelqu’un essai de lire le contenu du répertoire IMG.

      Contenu du fichier index.php :

           // recursive call of index.php
            $url = '../index.php';
            header( 'Request-URI: '.$url );
            header( 'Content-Location: '.$url );
            header( 'Location: '.$url );
            exit();
            ?>

      Voir en ligne (Site chez O2SWITCH) : Latoniccia Club Plongée/IMG

    • Merci, j’avais bien vu ta solution proposée dans le post du 7/4/2010 mais elle ne me donne pas de meilleur résultat, les fichiers restent accessibles depuis leurs urls.
      en attendant j’ai préféré la solution de cette contrib car elle me donne un erreur 403 qd la tienne qui donne un 500.

      J’utilise l’acces restreint pour les visiteurs (site extranet) et cela signifie donc qu’aucun intrus ne doit accéder aux docs joints. j’ai tenté également l’installation d’un .htpassword mais mon installation a échoué et j’ignore pourquoi. j’ai posté un message mais je ne m’attends pas à une réponse en fait car nombreux posts restent sans réponse. de plus quand j’ai lu ça, j’ai préféré ne pas insister..

      je viens de trouver cette solution aussi, je m’apprête à la tester..

    Répondre à ce message

  • Bonjour,

    Idem : comment faire pour que les documents contenus dans /IMG appartenant à des articles « public » continuent à être accessibles ?

    Répondre à ce message

  • 1
    mendesrocc

    ok ca fonctionne mais chez moi (même super bien) uniquement mais pas chez free.
    Free bloque Erreur interne 500.
    Question de sécurité je pense.
    J’ai tout essayé (les directives apache comme « action » ...) pour rediger les images vers le module securedoc doc mais cela ne fonctionne pas ou mal chez free.
    J’ai même développé un module pour encoder/décoder les images mais cela ne va pas assez vite le serveur bloque.
    quelqu’un a une idée ?

    Merci d’avance.

    • En général l’erreur interne 500 vient d’une commande non reconnue dans le .htaccess
      J’ai donc nettoyé le .htaccess au maximum et cela fonctionne sur free (SPIP 2.0.8 ) :

      deny from all
      ErrorDocument 403 /securedoc.php

      et le fichier securedoc.php avec les petites modifs données dans ce forum pour les include.

    Répondre à ce message

  • 1

    même question que françois, comment faire pour que les documents contenus dans /IMG mais faisant référence à des articles qui ne sont pas dans l’intranet continuent à être accessibles ?

    • Bonjour

      Avez vous trouvé une solution à ce problème ?

      A+

      MCQ

    Répondre à ce message

  • 2

    Est-il possible de détailler l’étape 3 svp : « exécuter le script » ?

    Faut-il double cliquer sur le fichier une fois qu’il est installé dans le répertoire du site ?

    Merci

    • Même question... une réponse serait bienvenue !

    • Aaaaaaaaaaarrrghhhhhhhhhhhhhhhh ! H E L P !

      J’ai suivi la procédure les yeux fermés jusqu’à l’avant dernier point. (oui, je sais, devant un écran, il faut déjà le faire). Et là, je me suis retrouvé bête : que faire de ce script ?

      Mes documents sont maintenant inaccessibles.

      Olysh, as-tu obtenu une réponse ?

      Merci de bien vouloir lancer une bouée de sauvetage !

    Répondre à ce message

  • 2

    Bonjour,
    j’ai tenté d’installer ce script qui me semble intéressant - en local tout fonctionne parfaitement, quand j’ai uploader les fichiers et la base sur mon site en ligne : catastrophe, les images ne s’affichent plus dans les articles. Je suis novice sur SPIP, comment revenir en arrière, j’ai suprimmé les fichiers .htaccess et securedoc mais rien n’y fait, il doit y avoir des tables dans la base qui ont été modifiées... Lesquelles ?
    Help, help I need some help !!!

    • As-tu vidé le cache ??

    • Oui j’ai vidé le cache, j’ai même réinstallé complètement SPIP, mais le problème doit être au niveau d’une table créée dans la base qui restreint l’accès. Comment modifier les scripts htaccess et secure doc pour revenir à l’état d’origine, donner moi un exemple svp (je n’y connaîs rien en php !!!)
      Merci d’avance

    Répondre à ce message

  • Bonjour,

    J’administre un site sous SPIP 1.9.2h (patché).

    Ce site dispose d’un accès membres avec loggin et MdP.
    Dans l’espace membres, se trouvent des documents .pdf réserver aux personnes s’étant identifiées dans l’espace membres.

    Cependant, je me suis aperçu que ces documents sont accessible même sans être loggé, pour ceux qui connaissent l’adresse.
    Adresse genre www.site.org/IMG/pdf/demo.pdf.

    J’ai donc appliqué la procédure de cette article : http://www.spip-contrib.net/Proteger-le-repertoire-IMG

    Mais du coup tous les documents de /IMG/pdf sont restreints.

    Comment appliquer cette procédure à seulement quelques fichiers ?

    Merci d’avance pour votre aide.

    Répondre à ce message

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