Aller au contenu

Protection des pièces jointes sous nginx

Le plugin dépose un .htaccess dans wp-content/uploads/solis-forms-uploads/, qui interdit l’exécution de tout script s’y trouvant.

nginx ne lit pas les fichiers .htaccess. Aucune extension ne peut écrire dans sa configuration, qui exige un rechargement du serveur : la règle doit donc être posée à la main. Sans elle, le dossier reste protégé du listage mais rien n’empêcherait l’exécution d’un script qui parviendrait à s’y déposer.

La règle

À ajouter dans le bloc server du site :

location ~* /wp-content/uploads/solis-forms-uploads/.*\.(php|phtml|php[0-9]|pl|py|jsp|asp|sh|cgi)$ {
    deny all;
    return 403;
}

Puis recharger : nginx -t && systemctl reload nginx.

Vérifier

Déposez un fichier test.php dans le dossier et appelez-le depuis un navigateur. La réponse attendue est 403. Si le fichier s’exécute, la règle n’est pas active — vérifiez qu’elle précède le location qui transmet les .php à PHP-FPM, nginx retenant la première correspondance parmi les expressions régulières.

Pensez à supprimer le fichier de test.

Pourquoi cette protection existe

Les types acceptés sont contrôlés d’après le contenu réel du fichier, et le nom enregistré est reconstruit à partir de l’extension retenue : un document.php.jpg devient {jeton}.jpg, l’extension double ne survit pas au dépôt.

Cette règle n’en reste pas moins nécessaire. La défense en profondeur ne suppose pas qu’un contrôle en amont soit infaillible, et la liste des types acceptés peut être élargie un jour, par une extension ou par une évolution du plugin.

Hébergements gérés

Certains hébergeurs (WP Engine, Kinsta, Pressable, o2switch…) interdisent déjà l’exécution de PHP dans wp-content/uploads. La règle est alors superflue, mais sans effet indésirable : la poser ne coûte rien et vous prémunit d’un changement de politique.