Informatique Apache .htaccess: quelques explications

.htaccess: quelques explications

Attention, ouverture dans une nouvelle fenêtre. PDFImprimerEnvoyer
3200 lecteurs

Note des utilisateurs: / 7
MauvaisTrès bien 

Votez!
C'est le seul retour qu'on a des internautes qui visitent les sites...


Sécuriser son site avec le fichier .htaccess

 

(article en cours de modifications suite à remodelage du fichier htaccess final)

Une des premières choses à faire une fois installé son cms favori (moi c'est joomla) est de le sécuriser.
Pour ce faire, on va d'abord s'attaquer au fichier .htaccess qui est lu et dont les instructions sont appliquées à la lettre par le serveur Apache hébergeant le site.

Ce genre de protection est, selon les dires de certains, inviolable. Je dirai donc "presqu'inviolable'.
En effet, si quelqu'un arrive à se connecter au site autrement que via son navigateur (ftp par exemple) c'est foutu, mais bon, cela signifie qu'il y avait une grosse faille de sécu quand-même.

Bref, le plus dur pour moi est de comprendre les règles de rewritecond et rewriterules.

Je vais donc me faire ici-même un petit pense-bête sur certaines d'entre-elles.

On commence par les règles de base.

 

Les règles de base donc:

Quelques petites choses que je place en début de fichier:
 

SetEnv REGISTER_GLOBALS 0

SetEnv PHP_VER 5

ServerSignature Off

Options All -Indexes

Options +FollowSymLinks

#SetEnv SERVER_ADMIN xxxxxxarobasetranquille-informatique.fr #ne se surcharge pas chez ovh on dirait

SetEnv TZ Europe/Paris

#allow_url_include 0 # déjà présente chez ovh par défaut

AddDefaultCharset UTF-8

AddLanguage fr-FR .html .htm .css .js

<Files .htaccess>

order allow,deny

deny from all

</Files>

 

Lignes 11, 12, 13 et 14:

interdire l'accès au fichier htaccess à travers le navigateur (mais normalement c'est déjà ainsi avec apache...)

ligne 1:

Définit si oui ou non les variables EGPCS (Environment, GET, POST, Cookie, Server) seront enregistrées comme des variables globales.
Par défaut sur Off normalement, mais il me semble avoir lu que Ovh (mon prestataire) la repassait à On. Donc on la re-désactive.
Pour en savoir plus, allez voir cette page: Utilisation des variables super-globales

Ligne 2:

positionner l'exécution du php v5 par défaut (chez ovh)

ligne 3:

Afficher (ou non) les signatures du serveur, lors d'une erreur, d'une page non trouvée ou autre, le serveur peut afficher des infos supplémentaires comme la version apache, le nom et l'adresse mail de l'admin, etc.
Fixée à non ici, car il faut donner un minimum d'informations aux éventuelles tentatives d'attaques.

Ligne 4:

ne pas permettre le listage des fichiers des dossiers, à partir du dossier dans lequel est le fichier htaccess en cours (racine / en général), et pour tous ses sous-dossiers.
Mettre +Indexes au lieu de -Indexes si l'on souhaite que le listage des dossiers soient possibles.
Si l'on souhaite qu'un dossier en particulier puisse être listé, mettre ici -Indexes, et créer un htaccess dans le dossier en question avec:
Options +Indexes

J'ai essayé ceci:

 

<Directory /dossier> 

  Options +Indexes

 </Directory>

dans le htaccess racine, mais apparemment chez ovh ça ne doit pas être autorisé...

Ligne 5:

suivre les liens symboliques du serveur, comme tout le monde ou presque, je ne vois pas trop, un rapport avec sans doute les liens symboliques unix, mais c'est loin de me concerner du coup...

Ligne 6:

fixer une adresse pour l'administrateur du site, Cette adresse est visible si on a positionné l'affichage des signatures serveurs à On.
comme je ne souhaite pas trop donner d'infos, je mets en commentaire.

Ligne 7:

Je fixe le fuseau horaire de mon site, en gros, ça peut servir sur certains calculs de dates, dans le futur, mais comme ça c'est fait.

Ligne 8:

Autoriser les iclusions de fichiers d'autres serveurs que celui sur lequel on est.
Cette variable positionnée à Off empêche normalement les includes de fichiers qui ne sont pas hébergés sur notre propre site.

Ligne 9:

pas question de sécurité ici, juste de jeux de caractères par défaut...

Ligne 10:

Positionner le language par défaut pour certains types de fichiers (pour voir)

 

Voyons maintenant comment interdire certaines actions sur certains fichiers avec ces instructions:


 

### INTERDIRE L'AFFICHAGE DE CERTAINS FORMATS DE FICHIER 
### EXÉCUTÉS PAR LE SERVEUR MAIS INTERDIT D'AFFICHAGE PAR LE NAVIGATEUR WEB
<Files ~ "\.(inc|class|sql|ini|conf|exe|dll|bin|tpl|bkp|dat|c|h|py|spd|theme|module)$">
deny from all
</Files>

moi je ne l'utilise pas mais bon

 Ensuite, voici quelques autres instructions générales concernant cette fois la partie la plus importante et difficile pour moi:

Le mode Rewrite

 

Options +FollowSymLinks

RewriteEngine On

RewriteBase /

RewriteCond %{HTTP_HOST} ^mon-site.fr$

RewriteRule ^(.*) http://www.mon-site.fr/$1 [QSA,L,R=301]

 

Ligne 1:
voilà ce que j'ai trouvé quelque part sur le web:
"cette option n'est pas obligatoire pour les rewriting classiques, c'est utile dans peu de cas, mais tout le monde le met ne sachant pas exactement à quoi ca sert"
Et pour le moment je vais faire comme tout le monde Cool

lignes 2 et 3:
Activer la réécriture d'url, indiquer le point de départ.

Ligne 4 et 5:
je souhaite ici que mon site soit toujours parcouru avec le www devant, donc tout ce qui arrive sans www, ou avec autre chose juste avant le .mon-site.fr est réécrit sous la forme www.mon-site.fr
Remplacer mon-site par le nom de domaine du site.

Passons à la suite maintenant, la réécriture proprement dite, conditions et exécution

le mieux pour le moment est d'aller voir là

là, beaucoup d'explications

et là aussi beaucoup

et au final là, excellent

et le htaccess fourni

 

 

Mon .htaccess actuel:

SetEnv REGISTER_GLOBALS 0
SetEnv PHP_VER 5
ServerSignature Off
Options All -Indexes
Options +FollowSymLinks
#SetEnv SERVER_ADMIN #ne se surcharge pas chez ovh on dirait
SetEnv TZ Europe/Paris

#allow_url_include 0 # déjà présente chez ovh par défaut

AddDefaultCharset UTF-8
AddLanguage fr-FR .html .htm .css .js

<Files .htaccess>
order allow,deny
deny from all
</Files>

#
# mod_rewrite: in use

RewriteEngine On

<ifmodule mod_rewrite.c>

RewriteBase /
RewriteCond %{HTTP_HOST} ^tranquille-informatique.fr$ 
RewriteRule ^(.*) http://www.tranquille-informatique.fr/$1 [QSA,L,R=301]

###############################################
# On bloque toute une série de failles potentielles
###############################################
#blacklist via query_string:
###############################################
RewriteCond %{QUERY_STRING} \.\.\/ [NC,OR]
RewriteCond %{QUERY_STRING} boot\.ini [NC,OR]
RewriteCond %{QUERY_STRING} tag\= [NC,OR]
RewriteCond %{QUERY_STRING} ftp\: [NC,OR]
RewriteCond %{QUERY_STRING} http\: [NC,OR]
RewriteCond %{QUERY_STRING} https\: [NC,OR]
RewriteCond %{QUERY_STRING} mosConfig_ [NC,OR]
RewriteCond %{QUERY_STRING} _vti_ [NC,OR]
RewriteCond %{QUERY_STRING} MSOffice [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)(%3C|<)/?script(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)(%3D|=)?javascript(%3A|:)(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)document\.location\.href(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)base64_encode(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(\(|\)|<|>|'|"|;|\?|\*).* [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(%22|%27|%3C|%3E|%5C|%7B|%7C).* [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(%0|%A|%B|%C|%D|%E|%F|127\.0).* [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(globals|encode|localhost|loopback).* [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(request|select|insert|union|declare|drop).* [NC]
RewriteRule ^(.*)$ - [F,L]
###############################################
# blacklist via http_user_agent:
###############################################
RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(HTTrack|clshttp|archiver|loader|email|nikto|miner|python).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(winhttp|libwww\-perl|curl|wget|harvest|scan|grab|extract).* [NC]
RewriteRule ^(.*)$ - [F,L]
###############################################
#blacklist via HTTP_cookie
###############################################
RewriteCond %{HTTP_COOKIE} ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC]
RewriteRule ^(.*)$ - [F,L]
###############################################
#blacklist via request_method
###############################################
RewriteCond %{REQUEST_METHOD} ^(delete|head|trace|track) [NC]
RewriteRule ^(.*)$ - [F,L]
###############################################
#blacklist via the_request
###############################################
RewriteCond %{THE_REQUEST} ^.*(\\r|\\n|%0A|%0D).* [NC]
RewriteRule ^(.*)$ - [F,L]
###############################################

###############################################
########## Begin - Joomla! core SEF Section
###############################################
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index.php
RewriteCond %{REQUEST_URI} (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$ [NC]
RewriteRule (.*) index.php
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
########## End - Joomla! core SEF Section
###############################################

###############################################
#empêcher les liens directs vers mes images à partir d'autres sites
###############################################
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://www.tranquille-informatique.fr/.*$ [NC]
ReWriteRule .*\.(gif|png|jpe?g|swf|flv)$ - [F]
###############################################

</ifmodule>



Attention à bien respecter l'ordre, d'abord le rewriteEngine à On, ensuite les cobtrages de failles, et enfin les règles de réécriture de joomla.