# ============================================================
# UPLOADS — aucune exécution de code
#
# Les extensions sont vérifiées à l'envoi, mais sur le nom déclaré :
# un fichier nommé .jpg peut contenir du PHP. Sans cette barrière,
# un compte compromis suffirait à exécuter du code sur le serveur.
# ============================================================

# Couper tout traitement par un moteur de scripts
<IfModule mod_php.c>
    php_flag engine off
</IfModule>
<IfModule mod_php7.c>
    php_flag engine off
</IfModule>
<IfModule mod_php8.c>
    php_flag engine off
</IfModule>

# En FPM, php_flag n'existe pas : on refuse les extensions exécutables
<FilesMatch "\.(php|php[0-9]?|phtml|phps|phar|pl|py|cgi|sh|shtml|htaccess)$">
    <IfModule mod_authz_core.c>
        Require all denied
    </IfModule>
    <IfModule !mod_authz_core.c>
        Order allow,deny
        Deny from all
    </IfModule>
</FilesMatch>

RemoveHandler .php .phtml .phar .cgi .pl .py
RemoveType .php .phtml .phar

<IfModule mod_headers.c>
    # Un SVG peut contenir du JavaScript : servi en pièce jointe, il n'est
    # plus interprété par le navigateur. Idem pour tout type deviné.
    Header set X-Content-Type-Options "nosniff"
    Header set Content-Security-Policy "default-src 'none'; img-src 'self'; style-src 'unsafe-inline'; sandbox"
    Header set Content-Disposition "attachment" env=DANGEROUS_UPLOAD
</IfModule>

<FilesMatch "\.(svg|svgz|xml|html?|xhtml)$">
    <IfModule mod_headers.c>
        Header set Content-Disposition "attachment"
    </IfModule>
</FilesMatch>

Options -Indexes -ExecCGI
