CAS DE FIGURE GÉNÉRAUX
Activer toutes les options sauf l’affichage du contenu des répertoires (rmq : ni Multiviews) :
Options All -Indexes
Désactiver uniquement l’affichage du contenu des répertoires :
Options -Indexes
Activer uniquement le suivi des liens symboliques :
Options +FollowSymLinks
Masquer les informations du serveur :
ServerSignature Off
Spécifier le fuseau horaire :
SetEnv TZ Europe/Paris
Ou, alternativement :
php_value date.timezone Europe/Paris
Encodage par défaut des fichiers textes et HTML :
AddDefaultCharset UTF-8
Protéger les fichiers .htaccess et .htpasswds :
<Files ~ "^.*\.([Hh][Tt][AaPp])"> order allow,deny deny from all satisfy all </Files>
Désactiver le hotlinking de vos images :
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?opensharing.priv [NC] RewriteRule \.(jpg|jpeg|png|gif)$ http://fakeimg.pl/400x200/?text=Pas_touche_aux_images [NC,R,L] </IfModule>
Bannir une adresse IP :
<Limit GET POST> order allow,deny deny from xxx.xxx.xxx.xxx allow from all </Limit>
Empêcher les visiteurs de ces sites d’accéder au votre :
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_REFERER} site1.com [NC,OR] RewriteCond %{HTTP_REFERER} site2.com [NC,OR] RewriteRule .* - [F] </IfModule>
Rediriger les visiteurs venant d’un site vers un autre :
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_REFERER} sitesource\.com/ RewriteRule ^(.*)$ http://www.sitedestination.com [R=301,L] </IfModule>
Redirection d’une page quelconque :
Redirect 301 /anciennepage/ http://opensharing.priv/nouvellepage
Redirection du site sans www vers www :
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP_HOST} ^opensharing\.priv [NC] RewriteRule ^(.*)$ http://www.opensharing.priv/$1 [L,R=301] </IfModule>
Redirection du site avec www vers la version sans www :
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.opensharing\.priv [NC] RewriteRule ^(.*)$ http://opensharing.priv/$1 [L,R=301] </IfModule>
Redirection vers HTTPS :
<IfModule mod_rewrite.c> RewriteCond %{SERVER_PORT} ^80$ RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R] </IfModule>
Forcer le téléchargement pour ces types de fichiers :
AddType application/octet-stream .doc .docx .xls .xlsx .csv .mp3 .mp4
Rediriger vers une page de maintenance personnalisée sauf pour mon adresse IP :
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_URI} !/maintenance.html$ RewriteCond %{REMOTE_ADDR} !^xxx\.xxx\.xxx\.xxx RewriteRule $ /maintenance.html [R=302,L] </IfModule>
Mise en cache des fichiers dans le navigateur :
<IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 month" ExpiresByType text/html "access plus 0 seconds" ExpiresByType text/xml "access plus 0 seconds" ExpiresByType application/xml "access plus 0 seconds" ExpiresByType application/json "access plus 0 seconds" ExpiresByType application/pdf "access plus 0 seconds" ExpiresByType application/rss+xml "access plus 1 hour" ExpiresByType application/atom+xml "access plus 1 hour" ExpiresByType application/x-font-ttf "access plus 1 month" ExpiresByType font/opentype "access plus 1 month" ExpiresByType application/x-font-woff "access plus 1 month" ExpiresByType application/x-font-woff2 "access plus 1 month" ExpiresByType image/svg+xml "access plus 1 month" ExpiresByType application/vnd.ms-fontobject "access plus 1 month" ExpiresByType image/jpg "access plus 1 month" ExpiresByType image/jpeg "access plus 1 month" ExpiresByType image/gif "access plus 1 month" ExpiresByType image/png "access plus 1 month" ExpiresByType video/ogg "access plus 1 month" ExpiresByType audio/ogg "access plus 1 month" ExpiresByType video/mp4 "access plus 1 month" ExpiresByType video/webm "access plus 1 month" ExpiresByType text/css "access plus 6 month" ExpiresByType application/javascript "access plus 6 month" ExpiresByType application/x-shockwave-flash "access plus 1 week" ExpiresByType image/x-icon "access plus 1 week" </IfModule> # En-têtes Header unset ETag FileETag None <ifModule mod_headers.c> <filesMatch "\.(ico|jpe?g|png|gif|swf)$"> Header set Cache-Control "public" </filesMatch> <filesMatch "\.(css)$"> Header set Cache-Control "public" </filesMatch> <filesMatch "\.(js)$"> Header set Cache-Control "private" </filesMatch> <filesMatch "\.(x?html?|php)$"> Header set Cache-Control "private, must-revalidate" </filesMatch> </ifModule>
Compressions des fichiers statiques :
<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/xhtml text/html text/plain text/xml text/javascript application/x-javascript text/css BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary Header append Vary User-Agent env=!dont-vary </IfModule> AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE font/opentype AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/json
Protection contre les injections de fichiers :
<IfModule mod_rewrite.c> RewriteCond %{REQUEST_METHOD} GET RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR] RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR] RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC] RewriteRule .* - [F] </IfModule>
Protections diverses (XSS, clickjacking et MIME-Type sniffing) :
<ifModule mod_headers.c> Header set X-XSS-Protection "1; mode=block" Header always append X-Frame-Options SAMEORIGIN Header set X-Content-Type-Options: "nosniff” </ifModule>
Limiter l’accès à un répertoire à certaines adresses IP :
<Limit GET POST PUT> order deny,allow deny from all allow from xxx.xxx.xxx.xxx allow from xxx.xxx.xxx.xxx allow from xxx.xxx.xxx.xxx </Limit>
CAS PROPRES À WORDPRESS
Rmq : Les règles custom doivent être ajoutées en dehors des balises # BEGIN | END WordPress. Dans le cas contraire, elles seraient supprimées.
Fichier .htaccess présent par défaut à la racine du site :
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
Protéger le fichier wp-config.php :
<files wp-config.php> order allow,deny deny from all </files>
Éviter le spam de commentaires :
<IfModule mod_rewrite.c> RewriteCond %{REQUEST_METHOD} POST RewriteCond %{REQUEST_URI} .wp-comments-post\.php* RewriteCond %{HTTP_REFERER} !.opensharing.priv.* [OR] RewriteCond %{HTTP_USER_AGENT} ^$ RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L] </IfModule>
Éviter qu’on puisse déterminer l’identifiant d’un utilisateur par son identifiant numérique :
<IfModule mod_rewrite.c> RewriteCond %{QUERY_STRING} ^author=([0-9]*) RewriteRule .* - [F] </IfModule>
Vérification avec :
http://mysite.opensharing.priv/?author=1
Bloquer l’utilisation de certains scripts :
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^wp-admin/includes/ - [F,L] RewriteRule !^wp-includes/ - [S=3] RewriteRule ^wp-includes/[^/]+\.php$ - [F,L] RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L] RewriteRule ^wp-includes/theme-compat/ - [F,L] </IfModule>
Seconde authentification pour l’accès au répertoire wp-admin (y placer le fichier .htaccess ci-dessous) :
<Files admin-ajax.php> Order allow,deny Allow from all Satisfy any </Files> AuthName "Connexion à l'administration" AuthType Basic AuthUserFile "/chemin/complet/vers/le/fichier/.htpasswd" Require valid-user
Bloquer les accès directs aux fichiers PHP du répertoire wp-includes (y placer le fichier .htaccess suivant) :
<Files wp-tinymce.php> allow from all </Files> <FilesMatch "\.(?i:php)$"> <IfModule !mod_authz_core.c> Order allow,deny Deny from all </IfModule> <IfModule mod_authz_core.c> Require all denied </IfModule> </FilesMatch> <Files wp-tinymce.php> Allow from all </Files> <Files ms-files.php> Allow from all </Files>
Bloquer les accès directs aux fichiers PHP du répertoire wp-content (y placer le fichier .htaccess suivant) :
<FilesMatch "\.(?i:php)$"> <IfModule !mod_authz_core.c> Order allow,deny Deny from all </IfModule> <IfModule mod_authz_core.c> Require all denied </IfModule> </FilesMatch>
Bloquer les accès directs aux fichiers PHP du répertoire wp-content/uploads/ (y placer le fichier .htaccess suivant) :
<FilesMatch "\.(?i:php)$"> <IfModule !mod_authz_core.c> Order allow,deny Deny from all </IfModule> <IfModule mod_authz_core.c> Require all denied </IfModule> </FilesMatch>