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.
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.
Aucune discussion
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
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.
Suivre les commentaires : |