Table des matières
Open Table des matières
Introduction
La sécurité d’un site web ne repose pas uniquement sur des headers ou un pare-feu. Elle commence aussi par des mesures préventives dans la configuration du serveur web.
Dans cet article, nous allons aborder 3 axes cruciaux pour protéger votre application via Nginx :
- L’interdiction d’accès aux fichiers sensibles (ex. : .env, .git, .htaccess)
- La désactivation de l’exécution PHP dans les répertoires d’upload
- La restriction des méthodes HTTP (seulement GET et POST autorisés)
Ces pratiques sont simples à mettre en place, mais trop souvent oubliées. Et pourtant, elles peuvent faire la différence entre un site sécurisé et un site compromis.
- 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 :
- .env (variables sensibles, mots de passe)
- .git (historique du code)
- .htaccess, .htpasswd
- .DS_Store, Thumbs.db, etc.
- Fichiers de config internes : .idea, .vscode, .svn, .project
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;
}
location ~* ^/uploads/.*.php$ { deny all; }
Tu peux élargir à d’autres extensions dangereuses :
location ~* ^/uploads/.*\.(php|phar|phtml|pl|py|cgi)$ {
deny all;
}
limit_except GET POST { deny all; }
Ce bloc :
- Refuse toute requête autre que GET ou POST
- Peut être appliqué globalement ou sur certains location
Exemple concret :
location /api/ {
limit_except GET POST {
deny all;
}
proxy_pass http://backend-api;
}
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;
}