Désactiver tous les CGI (php, perl, ...) pour un répertoire à l'aide .htaccess
J'ai un répertoire dans lequel les utilisateurs peuvent télécharger des fichiers.
Pour éviter les problèmes de sécurité (par exemple, quelqu'un téléchargement d'un malveillant script php), j'ai actuellement de modifier les fichiers d'extension en ajoutant .data
par exemple, mais ensuite lors du téléchargement du fichier, ils ont qu'à supprimer manuellement les .data
.
Une autre solution est de télécharger les fichiers dans un répertoire qui n'est pas servi par Apache, et avoir un script php de gérer tous les téléchargements en appelant readfile()
.
Ce que je voudrais faire est de simplement interdire l'exécution des scripts (php, perl, scripts cgi, tout ce que je peut installer dans le futur) dans le dossier de téléchargement. Cette SORTE de réponse suggère d'ajouter la ligne suivante dans un .htaccess
fichier dans ce dossier:
SetHandler default-handler
Cependant, dans mon cas, cela n'a aucun effet (l'exemple de script php que j'ai mis dans ce dossier est toujours exécuté). Ce que je fais mal?
De configuration d'Apache
La machine est un VPS (Serveur Privé Virtuel) en cours d'exécution Debian GNU/Linux 6.0.7 (squeeze)
, et aussi loin que je me souvienne (je note en bas de toutes les commandes que j'ai exécuté sur le serveur, donc ma "mémoire" doit être très précis), je dindn pas changer quoi que ce soit dans apache2 configuration, en dehors de l'exécution de sudo apt-get install php5
, et créer le fichier /etc/apache2/sites-enabled/mysite.com
avec le contenu suivant:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName mysite.com
ServerAlias www.mysite.com
DocumentRoot /home/me/www/mysite.com/www/
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /home/me/www/mysite.com/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from All
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
SetHandler default-handler
fonctionne bien pour empêcher l'exécution de code PHP dans un sous répertoire. Assurez-vous de mettre ce que la première ligne dans laDOCUMENT_ROOTsubdir/.htaccess
- Je vous remercie pour votre réponse. Dans
/etc/apache2/sites-enabled/mysite.com
, monDocumentRoot
est fixé à/home/me/www
, et le fichier/home/me/www/subdir/.htaccess
contient une seule ligneSetHandler default-handler
, et est lisible parwww-data
(j'ai vérifié à l'aide desudo su www-data; whoami; cat /home/me/www/subdir/.htaccess
, donc je soupçonne que le problème a quelque chose à voir avecAllowOverride
ou quelque chose comme ça. - Veuillez vous en assurer .htaccess est activé en mettant quelques ordures texte et de voir si ça génère une erreur 500 ou pas.
- Oui, j'ai un
Internal Server Error
quand j'ai mis les ordures dans la.htaccess
, merci pour l'astuce, je ne savais pas comment faire pour vérifier si il est activé ou pas. J'ai essayé de réglageAllowOverride All
dans/etc/apache2/sites-enabled/mysite.com
, et maintenant j'ai un comportement bizarre: lorsque vous accédez àhttp://mysite.com/subdir/
- je obtenir un404 Not Found
erreur, mais l'accèshttp://mysite.com/subdir/script.php
encore exécute le script php. - J'ai essayé différentes options (directement dans
/etc/apache2/sites-enabled/mysite.com
), et a constaté que la seule chose qui a désactivé les scripts PHP a été de mettre<Directory /home/me/www/subdir/>php_flag engine off</Directory>
, pas mêmeRemoveHandler .php .php3 .php4 .php5 .phtml
travaillé. Que signifie pour moi que le PHP semble court-circuitSetHandler
directives. Malheureusement, cela signifie que si un jour j'ai installer un autre moteur CGI, par exempleperl
, alors je vais avoir besoin de penser à désactiver aussi, à l'aide dephp_flag engine off
est absolument pas un bon moyen pour désactiver l'exécution de scrits pour un dossier. - Oui je suis d'accord
SetHandler
est certainement le plus robuste possible de résoudre ce problème. J'ai essayé cela, il a travaillé pour moi, ne sais pas pourquoi il ne fonctionne pas pour vous. - Pouvez-vous mettre ces 2 lignes l'une après l'autre:
SetHandler None
et puisSetHandler default-handler
- Oui, j'ai essayé aussi, et aussi essayé de mettre les deux lignes dans un
<Directory>
directive/etc/apache2/sites-enabled/mysite.com
, Mais il ne fonctionne toujours pas. J'ai enfin trouvé la solution: les directives ont été appliquées sur le répertoire lui-même (c'est pour ça que j'ai eu un404
lors de l'accès au répertoire) et de ne pas les fichiers à l'intérieur, donc j'ai dû écrire<Files *>SetHandler default-handler</Files>
, et dans ce cas, la directive est appliquée sur le dossier lui-même, les fichiers à l'intérieur, et tous les sous-dossiers, de manière récursive. Merci pour toute l'aide! - C'est super, content que tout s'est bien déroulé. +1 à votre question et la réponse 🙂
Vous devez vous connecter pour publier un commentaire.
Mettre ceci dans votre
.htaccess
:Mais cela a quelques trous de sécurité: on peut charger un .htaccess dans un sous-répertoire, et de remplacer ces paramètres, et ils peuvent également remplacer les .fichier htaccess lui-même!
Si vous êtes paranoïaque que le comportement de l'option devrait changer à l'avenir, mettez ceci dans votre
/etc/apache2/sites-enabled/mysite.com
Si vous ne pouvez pas modifier la configuration d'apache, puis placer les fichiers dans un
.htaccess
avec la structure de répertoire suivante:De cette façon, personne ne devrait être en mesure de remplacer votre
.../protected/.htaccess
fichier depuis leur uploads aller dans un sous-répertoire de.../protected
, pas dansprotected
lui-même.AFAICT, vous devriez être assez fort avec que.
chmod 444
(en lecture seule) sur le fichier s'empêcher de modifier directement le fichier, il ne sera pas éviter de remplacer le fichier (le supprimer et en créer un nouveau), comme seul le répertoire autorisations sont impliqués dans cette opération, de sorte que je ne recommande pas compter sur les fichiers en lecture seule si vous ne voulez pas leur contenu a changé.Mon Godaddy installation habitude de me permettre de modifier le httpd.fichiers de conf, et le php_flag commande ne fonctionne pas en raison de la façon dont ils ont mis en œuvre php pour moi.
J'ai été capable de l'utiliser dans mon
.htaccess
fichier:J'ai mis cela dans le répertoire ci-dessus où mon FTP utilisateur est autorisé à accéder, ce qui oblige tous les fichiers PHP dans le répertoire, ainsi que tous les sous-répertoires de montrer php en tant que texte brut.
Cela fonctionne pour d'autres types de fichiers ainsi. Tout ce que vous devez faire est d'ajouter une autre ligne avec ce que l'extension du fichier que vous voulez être forcé d'affichage en texte clair.
AddType text/plain cgi
par exemple.htaccess
fichier, cependant, de sorte que l'on ne peut pas télécharger un fichier nommé.htaccess
et d'écraser les vôtres. Voir la fin de ma réponse pour savoir comment le faire sans accès àhttpd.conf
.AllowOverride None
doit prendre soin de cela, mais je ne suis pas sûr à 100% si elle ne peut pas être substituée en aucune façon. Vous avez raison, cependant, a durci le programme d'installation nécessite réflexion et double-vérifier ce genre de points de défaillance.