SPIP - Contrib

[ar] [en] [es] [fr] [it]



Accueil du site > Administration > Protection documents

Protéger le répertoire IMG/

vendredi 10 décembre 2004, par Aurélien PIERARD. Dernier ajout dimanche 28 janvier 2007


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 :

- 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

- 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.

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.

texte - 3.7 ko
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

Zip - 2.6 ko
Protéger le répertoire IMG/ (Authentification)
Cette version impose à l’utilisateur d’être connecté.
Zip - 2.5 ko
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

P.-S.

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


Répondre à cet article

  • > Protéger le répertoire IMG/

    31 décembre 2004 13:54, par Cathy

    Bonjour,

    merci pour cette contrib. Je viens de tester la solution. En l’utilisant telle quelle j’obtenais un message d’erreur "undefined" sur la fonction "http_status()". Je l’ai remplacée par un "header()", dans securedoc.php3, et ça marche !

    Le seul inconvenient pour mon site est que je voudrais pouvoir garder des documents joints en accès libre, sans identification du lecteur. Or toutes les images et douments joints sont envoyés par SPIP dans le répertoire IMG.

    Est ce qu’on peut forcer SPIP à changer de répertoire, pour certaines rubriques par exemple ?

    Répondre à ce message

    • > Protéger le répertoire IMG/ 7 septembre 2007 16:54, par Alf

      Quant à moi, j’ai fait le contraire : J’ai ajouté

      include("ecrire/inc/headers.php") ;

      au début du fichier securedoc.php3.

      Salutations ;-)

      Répondre à ce message

      • > Protéger le répertoire IMG/ 27 février 2008 10:30, par mickael

        Bonjour,

        j’esaie d’utiliser cette astuce pour protéger l’accès au fichier dans IMG s’il n’y a pas de session ouverte.

        J’utilise le plug-in accès restreint pour gérer mes accès utilisateurs.

        j’ai modifié la ligne include("ecrire/inc_session.php3") par include("ecrire/inc/session.php") car je travaille sur la version 1.9.2.

        J’ai un message d’erreur 403 forbidden lorsque j’essaie d’accède raux documents soit par accès direct soit par le lien proposé par l’article sur SPIP.

        Y’a t’il d’autre choses à modifier ?

        Répondre à ce message

        • > Protéger le répertoire IMG/ 27 février 2008 12:02, par Alf

          Bonjour,

          Pour ma part, j’ai uniquement interdit l’accès direct aux fichiers du répertoire IMG (et à ses sous-rep) et je gère un accès restreint sans plugin en autorisant uniquement l’accès au(x) auteur(s) des articles dont je veux limiter l’accès.

          As-tu essayé de rajouter la ligne :

          include("ecrire/inc/headers.php") ;

          au début de securedoc.php ?

          Salutations

          Répondre à ce message

          • > Protéger le répertoire IMG/ 27 février 2008 17:43, par mickael

            Oui je l’ai rajouté.

            L’accès à mes docs est verrouillé aussi bien en ayant ouvert une session qu’en copiant collant le lien vers le dans le champ adresse de firefox.

            tu as seulement rajouter cette ligne de code sans autres modifs ?

            Répondre à ce message

            • > Protéger le répertoire IMG/ 27 février 2008 18:01, par Alf

              Voici le contenu de mon fichier securedoc.php3 :

              <?php

              include("ecrire/inc_version.php");
              include(
              "ecrire/inc/headers.php");

              function 
              not_found() {
                  
              http_status(404);
                  exit;
              }

              $uri $REQUEST_URI;
              $referer=$HTTP_REFERER;

              if (
              ereg(lire_meta("adresse_site"),$referer)){
                  
                  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();
              }


              ?>

              et celui du fichier .htaccess situé dans le répertoire IMG :

              ErrorDocument 404 http://127.0.0.1/intranet/erreur404.php3

              RewriteEngine On RewriteRule "\.(doc|pdf|sxw|ppt|ps|txt)$" ../securedoc.php3

              Deny from all ErrorDocument 403 ../securedoc.php3

              J’ai eu la flemme de créer une page d’erreur à la place de "http://127.0.0.1/intranet/erreur404.php3".

              Et puis c’est tout...

              Comme tu le vois : c’est le minimum syndical et cela marche.

              Par contre, je n’ai pas modifié le fichier .htaccess situé dans le répertoire principal du site avec les options

              ErrorDocument 404 erreur404.php3 options -indexes

              comme indiqué au début...

              Mais je ne sais plus pourquoi je ne l’ai pas fait, ça remonte à 6 mois...

              En tout cas, ça marche comme je le voulais.

              Répondre à ce message

              • > Protéger le répertoire IMG/ 27 février 2008 18:51, par mickael

                Dans

                if (ereg(lire_meta("adresse_site"),$referer))

                dis moi si je me trompe mais le "adresse_site" correspond à par exempel http://127.0.0.1/intranet ?

                Répondre à ce message

                • > Protéger le répertoire IMG/ 27 février 2008 20:20, par mickael

                  Ok ça à l’air de fonctionner, j’ai repris la première version du code et en mixant en rajoutant quelques ajustement avec le tien et j’obtiens ce que je souhaitais ! Reste plus qu’à créer les pages d’erreur !

                  merci pour ton aide !

                  Répondre à ce message

                  • > Protéger le répertoire IMG/ 28 février 2008 12:22, par mickael

                    Pour info, sur le document securedoc.ph je pense faire des petits réajustement en fonction du plug in accès restreint, car à l’heure actuel le prog vérifie juste qu’une session est ouverte mais pas par qui ce qui peut poser problème suivant le profil du connecté

                    Répondre à ce message

                    • > Protéger le répertoire IMG/ 28 février 2008 14:42, par Alf

                      Quant à moi, je ne préoccupe pas de savoir si le visiteur est loggué ou non à ce stade là.

                      C’est dans le squelette de la page que je vérifie si le visiteur l’est et s’il fait parti des auteurs de la page...

                      Donc, c’est + simple pour moi...

                      Quant à ma page erreur404, il faut d’abord que je me sorte les doigts du c## pour en faire une + claire...

                      @ +

                      Répondre à ce message

                      • > Protéger le répertoire IMG/ 8 juillet 2008 20:35, par mickael

                        suite à un changement de serveur la protection de mes docs est remise en cause alors que était Ok (impossiblité d’ouvrir les docs si non connecté). C’est dur de se remettre dans le code, je fais donc appel à des personnes qui comme moi ont subi ce type de désagréments pour avoir des pistes sur les éventuels changement à opérer.

                        Répondre à ce message

                        • > Protéger le répertoire IMG/ 9 juillet 2008 16:44, par mickael

                          réponse à moi-même : il semble qu’après test que le problème vienne du .htaccess du dossier IMG/. J’ai fait intervenir mon administrateur serveur pour qu’il me file un coup de main mais pour le moment pas de réponse...mais ça fait 24h et je n’ai pas de retour il doit sécher aussi sur le problème...

                          Répondre à ce message

    Retour au début des forums

  • Protéger le répertoire IMG/

    11 mai 2008 02:20

    Le script à l’air de bien fonctionner, mais quelqu’un pourrait me dire comment faire pour la 1.9.2d car l’article est assez vieux (2004)...

    Merci beaucoup !

    Répondre à ce message

    Retour au début des forums

  • > Protéger le répertoire IMG/

    30 décembre 2004 23:33, par Ben

    Bravo pour ce script que je n’ai pas essayé !!! Je place simplement un fichier index.html qui ne contient rien à la racine du dossier IMG et de ces sous-dossiers. Je suis conscient que la protection est "jeune", mais elle fait son effet...

    Répondre à ce message

    Retour au début des forums

  • Protéger le répertoire IMG/

    10 novembre 2006 17:09, par blumaise

    Excellente Contrib !! Merci Aurélien.

    Juste une précision sur le fichier .htaccess quand l’Apache tourne sur un OS Windows : La première ligne doit juste être : ErrorDocument 404 /erreur404.php3

    sans les ../

    Sinon le fichier .htaccess renvoit sur une page vide indiquant ../erreur404.php3

    Répondre à ce message

    Retour au début des forums



Suivre la vie du site RSS 2.0 | Plan du site | Espace privé | Charte et vie SPIP-Contrib | SPIP | L'autre.net