website/.htaccess

126 lines
5.1 KiB
ApacheConf
Raw Permalink Normal View History

2026-07-01 18:02:52 +02:00
# ----------------------------------------------------------------------
# OMEGAKUBE — Configuration de sécurité renforcée Apache (.htaccess)
# ----------------------------------------------------------------------
# 1. Désactiver l'exploration des répertoires (Directory Browsing)
Options -Indexes
# 2. Masquer les informations du serveur
ServerSignature Off
# 3. Restriction d'accès aux fichiers sensibles, cachés et de données
# A. Bloquer les fichiers commençant par un point (comme .git, .env, .htaccess)
<FilesMatch "^\.">
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
</FilesMatch>
# Exception explicite pour le fichier security.txt du dossier .well-known
<Files "security.txt">
<IfModule mod_authz_core.c>
Require all granted
</IfModule>
<IfModule !mod_authz_core.c>
Order deny,allow
Allow from all
</IfModule>
</Files>
# B. Bloquer les extensions sensibles (Configuration, scripts, logs, bases de données)
<FilesMatch "\.(env|md|sql|log|sh|cfg|ini|db|bak|conf)$">
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
</FilesMatch>
# C. Protection intelligente des fichiers .json
# On bloque TOUS les .json du serveur par défaut, SAUF ceux situés dans assets/data/
<FilesMatch "\.json$">
<IfModule mod_authz_core.c>
<If "%{REQUEST_URI} =~ m#^/assets/data/.*\.json$#">
Require all granted
</If>
<Else>
Require all denied
</Else>
</IfModule>
<IfModule !mod_authz_core.c>
# Sécurité de secours pour les versions d'Apache très anciennes
Order allow,deny
Deny from all
</IfModule>
</FilesMatch>
# 4. Exécution CGI activée par assets/python/.htaccess (plus fiable que FilesMatch racine)
# 5. En-têtes de sécurité HTTP (Recommandations Mozilla Observatory)
<IfModule mod_headers.c>
# HSTS (Strict-Transport-Security) : Force l'utilisation du HTTPS pour le domaine et les sous-domaines (durée 1 an)
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
# X-Frame-Options : Interdit le chargement du site dans une iframe (protection Clickjacking)
Header always set X-Frame-Options "DENY"
# X-Content-Type-Options : Force le navigateur à respecter le type MIME envoyé (protection contre le sniffing de contenu)
Header always set X-Content-Type-Options "nosniff"
# Referrer-Policy : Ne transmet le referer complet que pour les origines de confiance (HTTPS vers HTTPS interne)
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# Permissions-Policy : Restreint l'utilisation de fonctionnalités matérielles du navigateur pour la vie privée
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()"
# Content-Security-Policy (CSP) : Contrôle les sources d'où le site peut charger ses scripts, styles et médias.
Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://unpkg.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' https://cdn.discordapp.com data:; frame-src 'self' https://www.youtube.com https://www.youtube-nocookie.com; connect-src 'self'"
# X-XSS-Protection : Filtre XSS existant dans les anciens navigateurs (mode blocage actif)
Header always set X-XSS-Protection "1; mode=block"
</IfModule>
# 6. Règles de réécriture d'URL (mod_rewrite)
<IfModule mod_rewrite.c>
RewriteEngine On
# A. Redirection HTTPS automatique et robuste (compatible reverse proxies comme Cloudflare)
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# B. Pare-feu applicatif de base (WAF) contre les attaques par injection courantes
RewriteCond %{QUERY_STRING} concat.*\( [NC,OR]
RewriteCond %{QUERY_STRING} union.*select [NC,OR]
RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} base64_encode.*\( [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule ^(.*)$ - [F,L]
# C. Redirection des pages inexistantes ou dossiers sans fichier index vers une page 404 personnalisée
# Si le fichier demandé n'existe pas
RewriteCond %{REQUEST_FILENAME} !-f
# Et s'il ne s'agit pas d'un dossier
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ pages/404.php [L]
# Si le dossier demandé n'a aucun fichier d'index valide (index.html ou index.php)
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME}/index.html !-f
RewriteCond %{REQUEST_FILENAME}/index.php !-f
RewriteRule ^ pages/404.php [L]
</IfModule>
# 7. Pages d'erreur Apache natives (fallback de sécurité si mod_rewrite est absent)
ErrorDocument 404 /pages/404.php
ErrorDocument 403 /pages/404.php