web-dev-qa-db-fra.com

Bloquez l'accès direct à un fichier via http, mais autorisez l'accès aux scripts php

Je charge mes fichiers (pdf, doc, flv, etc.) dans un tampon et les sers à mes utilisateurs avec un script. J'ai besoin de mon script pour pouvoir accéder au fichier, mais pas pour y accéder directement. Quel est le meilleur moyen d'y parvenir? Devrais-je faire quelque chose avec mes autorisations ou verrouiller le répertoire avec .htaccess?

68
Brandon G

Le moyen le plus sûr est de mettre les fichiers de votre choix en dehors du répertoire racine Web, comme suggéré par Damien. Cela fonctionne parce que le serveur Web respecte les privilèges du système de fichiers local et non ses propres privilèges.

Cependant, il existe de nombreuses sociétés d'hébergement qui vous donnent uniquement accès à la racine Web. Pour toujours empêcher les requêtes HTTP aux fichiers, placez-les dans un répertoire avec un fichier .htaccess qui bloque toutes les communications. Par exemple,

Order deny,allow
Deny from all

Votre serveur Web, et donc votre langage côté serveur, pourront toujours les lire car les autorisations locales du répertoire permettent au serveur Web de lire et d'exécuter les fichiers.

À votre santé.

88
Sam Bisbee

C'est ainsi que j'ai empêché l'accès direct d'URL à mes fichiers ini. Collez le code suivant dans le fichier .htaccess à la racine. (pas besoin de créer un dossier supplémentaire)

<Files ~ "\.ini$">
  Order allow,deny
  Deny from all
</Files>

mon fichier settings.ini est à la racine et sans ce code, il est accessible à l'adresse www.mondomaine.com/settings.ini

32
Aamir Mahmood

dans httpd.conf pour bloquer l’accès du navigateur et wget afin d’inclure des fichiers, en particulier db.inc ou config.inc Notez que vous ne pouvez pas chaîner les types de fichier dans la directive à la place, créez plusieurs directives de fichier. 

<Files ~ "\.inc$">
Order allow,deny
Deny from all
</Files>

pour tester votre configuration avant de redémarrer Apache

service httpd configtest

puis (redémarrage gracieux)

service httpd graceful
2
zzapper

Les fichiers sont-ils sur le même serveur que le script PHP? Si tel est le cas, conservez les fichiers hors de la racine Web et assurez-vous que votre script PHP dispose des autorisations en lecture pour l'emplacement où ils sont stockés.

2
Damien Wilson

Si vous avez accès à votre fichier httpd.conf (dans Ubuntu, il se trouve dans le répertoire/etc/Apache2), vous devez ajouter les mêmes lignes que vous auriez dans le fichier .htaccess du répertoire spécifique. C'est (par exemple):

ServerName YOURSERVERNAMEHERE
<Directory /var/www/>
AllowOverride None
order deny,allow
Options -Indexes FollowSymLinks
</Directory>

Faites cela pour chaque répertoire pour lequel vous souhaitez contrôler les informations, et vous aurez un fichier dans un emplacement pour gérer tous les accès. Dans l'exemple ci-dessus, je l'ai fait pour le répertoire racine,/var/www.

Cette option peut ne pas être disponible avec un hébergement externalisé, en particulier un hébergement partagé. Mais c'est une meilleure option que d'ajouter de nombreux fichiers .htaccess.

1
Sablefoste

Que diriez-vous du script .htaccess basé sur un module personnalisé (comme celui utilisé dans CodeIgniter)? J'ai essayé et cela a bien fonctionné dans les applications CodeIgniter. Des idées pour l'utiliser sur d'autres applications?

<IfModule authz_core_module>
    Require all denied
</IfModule>
<IfModule !authz_core_module>
    Deny from all
</IfModule>
0
Cosmo Arun

Pour empêcher les fichiers .ini d’accéder au Web, insérez les éléments suivants dans Apache2.conf.

<Files ~ "\.ini$">
Order allow,deny
Deny from all
</Files>
0
Daniel Boakye