Aller au contenu

Limiter les risques sur Nginx : fichiers sensibles, uploads, méthodes HTTP

Brandon Visca
Date de publication:

💡 TL;DR

  • La sécurité Nginx commence dans la config, pas seulement avec les headers ou le pare-feu
  • Bloquer l’accès aux fichiers sensibles et interdire l’exécution de scripts dans les dossiers d’uploads
  • Limiter les méthodes HTTP aux seules actions légitimes

Table des matières

Table des matières

1. Interdire l’accès aux fichiers sensibles

Certains fichiers générés par vos outils ou frameworks ne doivent jamais être accessibles via le navigateur. C’est le pendant côté système de fichiers de ce que font les headers de sécurité côté navigateur :

Objectif : Empêcher qu’un utilisateur accède à ces fichiers avec une simple URL du type https://monsite.com/.env.

Configuration Nginx recommandée :

location ~ /\.(ht|git|env|svn|project|idea|DS_Store|vscode) {
    deny all;
    access_log off;
    log_not_found off;
}

🔒 Ce bloc :

✅ Tu peux le placer dans ton bloc server {} ou dans un include partagé entre tes vhosts.


2. Bloquer l’exécution de scripts dans /uploads

Les dossiers où les utilisateurs peuvent téléverser des fichiers sont des zones à haut risque.

Si un pirate réussit à envoyer un fichier .php, il pourrait l’exécuter ensuite en visitant : https://monsite.com/uploads/malicieux.php

🔥 Cela peut aboutir à une prise de contrôle complète du serveur si le script injecté contient une backdoor.

Objectif : autoriser l’upload de fichiers… mais jamais leur exécution

Configuration Nginx :

location ~* ^/uploads/.*\.php$ {
    deny all;
}

Tu peux élargir à d’autres extensions dangereuses :

location ~* ^/uploads/.*\.(php|phar|phtml|pl|py|cgi)$ {
    deny all;
}

💡 Conseil : sépare bien tes dossiers d’upload et tes scripts PHP.


3. Limiter les méthodes HTTP autorisées

Par défaut, un serveur web accepte plusieurs méthodes :

🛑 Certaines de ces méthodes sont dangereuses si activées inutilement, surtout dans les backends dynamiques.

Exemple de faille :

Une API exposée sans restriction peut accepter une requête DELETE non protégée, ce qui peut effacer des données.


Solution : restreindre aux méthodes nécessaires

limit_except GET POST {
    deny all;
}

Ce bloc :

Exemple concret :

location /api/ {
    limit_except GET POST {
        deny all;
    }

    proxy_pass http://backend-api;
}

Astuce : tester avec curl

Pour vérifier si ton serveur accepte d’autres méthodes, utilise cette commande :

curl -X DELETE https://monsite.com/

Si tu reçois une réponse 405 Not Allowed, c’est bon signe. Sinon… corrige vite !


Bonus : interdire les requêtes sur des chemins “pièges”

Certains bots scannent le web à la recherche de fichiers mal configurés. Tu peux les bloquer préventivement :

location ~* /(composer\.json|composer\.lock|package\.json|wp-config\.php|php\.ini)$ {
    deny all;
}

Et tu peux aussi bloquer les requêtes contenant certains user-agents suspects ou chemins spécifiques.


Une fois ces trois règles en place, il reste à cadrer ce que le navigateur a le droit de charger : c’est le rôle de la Content-Security-Policy.


Checklist à appliquer

VérificationStatut idéal
Fichiers sensibles inaccessibles✅ OK
PHP interdit dans les dossiers publics✅ OK
Seules les méthodes GET/POST actives✅ OK
Accès REST/API protégé✅ OK
Logging désactivé sur les interdictions✅ OK

En résumé

Ces protections sont simples, légères, et redoutablement efficaces. Ce sont des pratiques recommandées par tous les standards modernes, y compris l’OWASP.


Ressources utiles

Précédent
Nginx location : blocs, priorités et pièges de sécurité
Suivant
Content-Security-Policy : Protéger votre site sans bloquer vos utilisateurs