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 la DOCUMENT_ROOTsubdir/.htaccess
  • Je vous remercie pour votre réponse. Dans /etc/apache2/sites-enabled/mysite.com, mon DocumentRoot est fixé à /home/me/www, et le fichier /home/me/www/subdir/.htaccess contient une seule ligne SetHandler default-handler, et est lisible par www-data (j'ai vérifié à l'aide de sudo su www-data; whoami; cat /home/me/www/subdir/.htaccess, donc je soupçonne que le problème a quelque chose à voir avec AllowOverride 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églage AllowOverride 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 un 404 Not Found erreur, mais l'accès http://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ême RemoveHandler .php .php3 .php4 .php5 .phtml travaillé. Que signifie pour moi que le PHP semble court-circuit SetHandler directives. Malheureusement, cela signifie que si un jour j'ai installer un autre moteur CGI, par exemple perl, alors je vais avoir besoin de penser à désactiver aussi, à l'aide de php_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 puis SetHandler 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 un 404 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 🙂