Droit d'accès en direct sur un des fichiers

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour le forum,

Attention, un novice de plus dans l'univers Drupal!
Je m'occupe de maintenir un site développé avec Drupal et après avoir passé quelques jours à regarder comment ce CMS fonctionne, je m'occupe de corriger quelques failles de sécurité.

Observation:
Un "user" appartient à un groupe "userGroup" et "monSiteDrupal" requiert une authentification pour accéder aux différents "node". J'ai un problème de sécurité avec des fichiers qui sont présents dans le dossier "monSiteDrupal/files/admin/userGroup/file.pdf" puisqu'ils sont accessibles sans que l'utilisateur n'ait besoin de s'identifier; c'est à dire en entrant directement l'url du fichier "file.pdf" (http://www.monSiteDrupal/files/admin/userGroup/file.pdf)

Est-ce que quelqu'un aurait une solution à mon problème ? .htaccess ou script Php ou ..?

Merci d'avance,
Baptiste

Version de Drupal : 

Bonjour Numerizen,

J'ai bien trouvé la page où je peux modifier le mode 'Publique' en 'Privé', ceci étant, j'ai une erreur sur mon tableau de bord :

"File Download Method -- Private Downloads
Imagecache will not operate properly using Private Files. Please enable Public File Transfer."

Remarque:
Cette option permet d'interdire le transfert des fichiers directement pas le protocol http or sur la page d'accueil de "monSiteDrupal" j'ai des fichiers mis à disposition pour des "users" non identifiés... est-ce que cela va s'avérer bloquant?

Merci d'avance,
Bap

Personnellement, j'ai créé un .htaccess dont le contenu est le suivant.
Ceci interdit l'accès à des pages spécifiques si l'appel ne se fait pas depuis l'url du site. Ca vaut ce que ça vaut, mais ça marche.

Options None
Options +FollowSymLinks
SetEnvIfNoCase Referer "^http://www.monsite.com/" acces_local=1
<FilesMatch ".(gif|jpg|png|pdf|css|js|JPG)">
Deny from all
Allow from env=acces_local
</FilesMatch>

Juls, Numerizen,

tout d'abord merci pour votre aide pour ma problématique.

Je n'ai cependant pas encore trouvé la solution optimale puisque le code de Juls (pour un ".htaccess") me bloque l'accès aux fichiers choisis pour tous les internautes qui visitent "monSiteDrupal" qu'ils soient visiteurs ou utilisateurs authentifiés...

Or, dans un dossier donné, j'ai besoin que les utilisateurs authentifiés aient accès à certains fichiers PDF.

Arf !
En fait, je me suis peut-etre mal exprimé... Je reformule.

  1. Tu colles mon bout de code dans le dossier que tu veux protéger.
  2. Tu vérifies bien que les extensions que tu utilises soient bien celles du .htaccess (Je me suis fait avoir car il y a une différence entre .JPG et .jpg par exemple).
  3. A partir de maintenant, tous les fichiers qui contiennent ces extensions sont bloqués pour tous les visiteurs (identifiés ou non).

MAIS, s'il y a un lien SUR TON SITE qui pointe vers un de ces fichiers, l'utilisateur qui clique sur le lien (depuis ton site) aura accès au fichier protégé.
En effet, le .htaccess interdit l'accès à tes fichiers si ces accès se font depuis un domaine différent du tien.

Partant de ce principe :
Sur une page accessible à tout le monde, tu mets un lien vers "MonFichier1.pdf"
Si un visiteur arrive sur ton site, il aura accès à ce fichier. Il lui suffira de cliquer sur le lien.

Sur une page protégée (accessible après identification), tu mets un lien vers "MonFichierEnAccesRestreint.pdf", l'utilisateur qui a accès à cette page a aussi accès à ce fichier. (toujours en cliquant sur le lien).

Dernier cas : l'utilisateur non identifié connait le chemin d'accès au fichier "MonFichierEnAccesRestreint.pdf"
exemple : http://monsiteamoi.com/sites/mesfichiers/MonFichierEnAccesRestreint.pdf"

S'il tape cette adresse, il n'arrivera pas à accéder au fichier puisqu'il faut qu'il ait cliqué sur un lien de ton site pour y parvenir.
Personnellement j'utilise cette méthode combinée avec le module Node Privacy By Role et ça marche super bien.

Tiens nous au courant !

Bonjour Juls, le forum,

C'est bien cool de prendre du temps pour mon problème!
J'ai vraiment un truc qui ne colle pas, c'est curieux; Je travaille en local sur mon PC pour éviter de faire des tests en production. Et voila exactement ce que j'ai fait :

  • A la racine de mon site, j'avais un ".htaccess" de déja présent avec la conf. suivante ci-après et j'ai ajouter le bout de code que tu m'a donné.

#
# Apache/PHP/Drupal settings:
#

# Protect files and directories from prying eyes.
<FilesMatch ".(engine|inc|info|install|module|profile|po|sh|.sql|theme|tpl(.php)?|xtmpl)$|^(code-style.pl|Entries.|Repository|Root|Tag|Template)$">
  Order allow,deny
</FilesMatch>

<strong>
SetEnvIfNoCase Referer "^http://www.itii-pdl.com" acces_local=1
<FilesMatch ".(pdf|PDF|csv|CSV|doc|DOC|xls|XLS|txt|TXT)">
   Deny from all
  Allow from env=acces_local
</FilesMatch>
</strong>

# Don't show directory listings for URLs which map to a directory.
Options -Indexes

# Follow symbolic links in this directory.
Options +FollowSymLinks

# Customized error messages.
ErrorDocument 404 /index.php

# Set the default handler.
DirectoryIndex index.php

# Override PHP settings. More in sites/default/settings.php
# but the following cannot be changed at runtime.
php_value memory_limit 1024M
#php_value upload_max_filesize 32000000

# PHP 4, Apache 1.
<IfModule mod_php4.c>
  php_value magic_quotes_gpc                0
  php_value register_globals                0
  php_value session.auto_start              0
  php_value mbstring.http_input             pass
  php_value mbstring.http_output            pass
  php_value mbstring.encoding_translation   0
</IfModule>

# PHP 4, Apache 2.
<IfModule sapi_apache2.c>
  php_value magic_quotes_gpc                0
  php_value register_globals                0
  php_value session.auto_start              0
  php_value mbstring.http_input             pass
  php_value mbstring.http_output            pass
  php_value mbstring.encoding_translation   0
</IfModule>

# PHP 5, Apache 1 and 2.
<IfModule mod_php5.c>
  php_value magic_quotes_gpc                0
  php_value register_globals                0
  php_value session.auto_start              0
  php_value mbstring.http_input             pass
  php_value mbstring.http_output            pass
  php_value mbstring.encoding_translation   0
</IfModule>

# Requires mod_expires to be enabled.
<IfModule mod_expires.c>
  # Enable expirations.
  ExpiresActive On
  # Cache all files for 2 weeks after access (A).
  ExpiresDefault A1209600
  # Do not cache dynamically generated pages.
  ExpiresByType text/html A1
</IfModule>

# Various rewrite rules.
<IfModule mod_rewrite.c>
  RewriteEngine on

  # Rewrite current-style URLs of the form 'index.php?q=x'.
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

  </IfModule>

# $Id: .htaccess,v 1.81.2.4 2008/01/22 09:01:39 drumm Exp $

  • En local, j'ai bien évidemment SetEnvIfNoCase Referer "^http://localhost/site_web_itii/" acces_local=1 au lieu de SetEnvIfNoCase Referer "^http://www.itii-pdl.com" acces_local=1

  • En incluant ton bout de code dans le ".htaccess" existant, j'espère ainsi que la prise en compte sera sur tout le site..

==> Tout semble fonctionner en local, mais pas en production! L'accès aux pages est interdit pour tous les utilisateurs, authentifiés comme annonymes !! :-(

Est-ce que tu vois quelque chose à laquelle je n'aurai pas fait attention, ou bien que je n'aurai pas comprise?

Merci, ++
Bap

Salut !
Personnellement, je pars du principe qu'il faut éviter toute modification sur l'installation de base de drupal, surtout en terme de sécurité et donc de fichiers .htaccess.
C'est pour cette raison que je me suis contenté d'ajouter mon .htaccess spécifique uniquement sur les répertoires nécessitant une protection particulière.
Et... ça marche !

Tiens moi au courant !