Apache et son fichier .htaccess

Le fichier .htaccess permet d'optimiser la sécurité et le référencement d'un site internet hébergé sur un serveur Apache.

 

Notes

- Si votre hébergeur est OVH sur un mutualisé, le fichier .htaccess semble pouvoir être encodé en ANSI. A suivre. (1)
- Pour encoder votre fichier .htaccess, on utilise en règle générale Notepad++ avec un encodage en UTF-8 sans BOM.
- Qui a dit qu'on ne peut pas créer de fichier .htaccess avec Windows ? Tentez donc de renommer votre fichier "texte.txt" en ".htaccess".

- Mettre les filtres anti-pirates en premier et les règles URL rewriting à la fin.
En effet, les filtres s’appliquent du premier au dernier.

- Ne mettez pas les règles .htaccess d’un coup.
Copier une règle, puis, tester votre CMS, blog, forum. Ajouter/Modifier un article. Ajouter/Effacer un utilisateur, accéder à votre interface d’administration et faites plusieurs choses.
Si tout est OK, passer à la règle suivante.

- Si dans l’utilisation de votre CMS, blog, forum, vous voyez une erreur 403, alors il est probable qu’une règle de filtrage soit active.

- En cas de problème, regarder l’URL appelée.
Il y a peut-être un mot clé qui est bloqué par le fichier .htaccess.
Le système filtre l’URL et regarde s’il est conforme à une utilisation normale.
Si vous avez un message d’erreur, trouvez le mot clé qui bloque la requête depuis le fichier .htaccess.

- Il faut adapter ces règles à votre cas, ce n’est pas du simple copier-coller.
Vérifier bien si un realpath est demandé, ou, un nom de domaine.

 

Interdire le listage d'un dossier

Options -Indexes

 

Interdire l'accès à votre fichier .htaccess depuis un navigateur web

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

 

Passer l'environnement en PHP5

Les erreurs de version de langage PHP peuvent être corrigées dans le fichier .htaccess en indiquant la bonne version de PHP à utiliser par défaut.
Ajouter cette ligne dans le fichier .htaccess

SetEnv PHP_VER 5

 

Limiter les logiciels et aspirateurs de site

Cette règle bloque une grande part des attaques automatiques.
Cette liste est le minimum qu’il faut avoir et donne d’excellents résultats.

###FILTRE CONTRE CERTAINS ROBOTS DES PIRATES
RewriteEngine On

## EXCEPTION
## TOUS LES ROBOTS MEMES ANONYMES OU BANNIS PEUVENT ACCEDER A CES FICHIERS
RewriteCond %{REQUEST_URI} !^/robots.txt
RewriteCond %{REQUEST_URI} !^/sitemap.xml
## ANONYMES
RewriteCond %{HTTP_USER_AGENT} ^-?$ [OR]

## BIBLIOTHEQUES / CLASSES HTTP DONT ON NE VEUT PAS.
## ATTENTION, CELA PEUT BLOQUER CERTAINES FONCTIONS DE VOTRE CMS.
## NE PAS TOUT EFFACER, CHERCHER LE NOM DE LA CLASSE HTTP CONCERNEE. DEMANDER A LA COMMUNAUTE DE VOTRE CMS.
## CETTE LISTE BLOQUE 80% DES ROBOTS SPAMMEURS.
RewriteCond %{HTTP_USER_AGENT} ^curl|^Fetch\ API\ Request|GT\:\:WWW|^HTTP\:\:Lite|httplib|^Java|^LeechFTP|lwp-

trivial|^LWP|libWeb|libwww|^PEAR|PECL\:\:HTTP|PHPCrawl|PycURL|python|^ReGet|Rsync|Snoopy|URI\:\:Fetch|urllib|WebDAV|^Wget [NC] 

## CEUX QUI INVENTENT DES NOMS AU HASARD, RETIREZ LES 2 DIESES EN DEBUT DE LIGNE POUR L'ACTIVER
## RewriteCond %{HTTP_USER_AGENT} ^[bcdfghjklmnpqrstvwxz\ ]{10,}|^[0-9a-z]{15,}|^[0-9A-Za-z]{19,}|^[A-Za-z]{3,}\ [a-z]{4,}\ [a-z]{4,} [OR]

RewriteRule (.*) - [F]

 

Bloquer des failles potentielles

Les règles suivantes vont permettre de contrer quelques attaques connues.

### FILTRE CONTRE XSS, REDIRECTIONS HTTP, base64_encode, VARIABLE PHP GLOBALS VIA URL
### MODIFIER VARIABLE _REQUEST VIA URL, TEST DE FAILLE PHP, INJECTION SQL SIMPLE
RewriteEngine On
RewriteCond %{REQUEST_METHOD} (GET|POST) [NC]
RewriteCond %{QUERY_STRING} ^(.*)(%3C|<)/?script(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)(%3D|=)?javascript(%3A|:)(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)document\.location\.href(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^.*(%24&x).* [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(127\.0).* [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)(%3D|=)(https?|ftp|mosConfig)(%3A|:)//(.*)$ [NC,OR]

## ATTENTION A CETTE REGLE. ELLE PEUT CASSER CERTAINES REDIRECTIONS RESSEMBLANT A: http://www.truc.fr/index.php?r=http://www.google.fr ##

RewriteCond %{QUERY_STRING} ^.*(_encode|localhost|loopback).* [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)GLOBALS(=|[|%[0-9A-Z]{0,2})(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)_REQUEST(=|[|%[0-9A-Z]{0,2})(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)(SELECT(%20|\+)|UNION(%20|\+)ALL|INSERT(%20|\+)|DELETE(%20|\+)|CHAR\(|UPDATE(%20|\+)|REPLACE(%20|\+)|LIMIT(%20|\+)|CONCAT(%20|\+)|DECLARE(%20|\+))(.*)$ [NC]
RewriteRule (.*) - [F]

 

Bloquer certaines requêtes étranges

### NEUTRALISE DES FAUSSES URLS OU VIEUX SYSTEMES OBSOLETES
RedirectMatch 403 (\.\./|base64|boot\.ini|eval\(|\(null\)|^[-_a-z0-9/\.]*//.*|/etc/passwd|^/_vti.*|^/MSOffice.*|/fckeditor/|/elfinder/|zoho/|/jquery-file-

upload/server/|/assetmanager/|wwwroot|e107\_)
# DESACTIVE LES METHODES DE REQUETES TRACE TRACK DELETE
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(TRACE|DELETE|TRACK) [NC]
RewriteRule ^.* - [F]

 

Interdire l'affichage d'un fichier ou type de fichier

Le fichier index.php est le fichier par défaut. Afficher index.htm ne marchera pas.
Les fichiers de configuration en .xml sont à interdire en affichage depuis le navigateur.
Il faut tester ces interdictions et les adapter au cas par cas si nécessaire.

### SEUL LE FICHIER index.php EST SERVI COMME PREMIER FICHIER PAR DEFAUT. LES AUTRES SONT INTERDITS
DirectoryIndex index.php

### INTERDIRE LES AUTRES TYPES DE FICHIER INDEX
<Files ~ "^(index)\.(p?s?x?htm?|txt|aspx?|cfml?|cgi|pl|php[3-9]|jsp|xml)$">
order allow,deny
deny from all
</Files>

### 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|mdb|rar|bash|git|hg|log|svn|swp|cvs)$">
deny from all
</Files>

### INTERDIRE L'AFFICHAGE DE CERTAINS FICHIERS COMME config, option, login, setup, install, admin, home, default, xmlrpc.
### A ADAPTER SI CELA POSE PROBLEME, NOTAMMENT RETIREZ wp-(login|admin|config)| SI VOUS UTILISEZ WORDPRESS
<Files ~ "^(wp-(login|admin|config)|config(\.inc)?|install?|admin|login|configure|configuration|options?\.inc|option|settings?(\.inc)?|functions?(\.inc)?|setup

(\.inc)?|default|home|xmlrpc|bigdump|uploadTester|errors?|test|data|members?|hacke?r?d?|[-_a-z0-9.]*mafia[-_a-z0-9.]*|[-_a-z0-9.]*power[-_a-z0-9.]*|[-_a-z0-9.]*jihad

[-_a-z0-9.]*|php|shell|ssh|root|cmd|[0-9]{1,6})\.(p?s?x?htm?l?|txt|aspx?|cfml?|cgi|pl|php[3-9]{0,1}|jsp?|sql|xml)$">
order allow,deny
deny from all
</Files>

 

Bloquer les scripts utilisés par les pirates

Si des pirates réussissent à pénétrer votre site, ils installent un script qui permet de prendre les commandes de l'hébergement.
On bloque ici la plupart des commandes de ces scripts.
À tester avec votre site web.

Remplacer "/home/loginftp/" par votre chemin de fichier absolu avant le dossier "www" ou "public_html".
Faites des sauvegardes fonctionnelles avant d'appliquer cette règle.
À utiliser en dernier, puis à tester longuement.
Commenter la règle qui pose problème.

### FILTRE CONTRE PHPSHELL.PHP, REMOTEVIEW, c99Shell et autres
RewriteEngine On
RewriteCond %{REQUEST_URI} .*((php|my)?shell|remview.*|phpremoteview.*|sshphp.*|pcom|nstview.*|c99|r57|webadmin.*|phpget.*|phpwriter.*|fileditor.*|locus7.*|storm7.*)

\.(p?s?x?htm?l?|txt|aspx?|cfml?|cgi|pl|php[3-9]{0,1}|jsp?|sql|xml) [NC,OR]
RewriteCond %{REQUEST_METHOD} (GET|POST) [NC]
RewriteCond %{QUERY_STRING} ^(.*)=/home/loginftp/(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^work_dir=.*$ [OR]
RewriteCond %{QUERY_STRING} ^command=.*&output.*$ [OR]
RewriteCond %{QUERY_STRING} ^nts_[a-z0-9_]{0,10}=.*$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)cmd=.*$ [OR]

## ATTENTION A CETTE REGLE. ELLE PEUT CASSER VOTRE SITE ##

RewriteCond %{QUERY_STRING} ^c=(t|setup|codes)$ [OR]
RewriteCond %{QUERY_STRING} ^act=((about|cmd|selfremove|chbd|trojan|backc|massbrowsersploit|exploits|grablogins|upload.*)|((chmod|f)&f=.*))$ [OR]
RewriteCond %{QUERY_STRING} ^act=(ls|search|fsbuff|encoder|tools|processes|ftpquickbrute|security|sql|eval|update|feedback|cmd|gofile|mkfile)&d=.*$ [OR]
RewriteCond %{QUERY_STRING} ^&?c=(l?v?i?&d=|v&fnot=|setup&ref=|l&r=|d&d=|tree&d|t&d=|e&d=|i&d=|codes|md5crack).*$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)([-_a-z]{1,15})=

(ls|cd|cat|rm|mv|vim|chmod|chdir|concat|mkdir|rmdir|pwd|clear|whoami|uname|tar|zip|unzip|gzip|gunzip|grep|more|ln|umask|telnet|ssh|ftp|head|tail|which|mkmode|touch|log

name|edit_file|search_text|find_text|php_eval|download_file|ftp_file_down|ftp_file_up|ftp_brute|mail_file|mysql|mysql_dump|db_query)([^a-zA-Z0-9].+)*$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)(wget|shell_exec|passthru|system|exec|popen|proc_open)(.*)$
RewriteRule (.*) - [F]

 

Empêcher l'exécution des scripts PHP, Perl, CGI

Empêcher l’exécution de tout script PHP, Perl, CGI dans un dossier sensible pour renforcer la sécurité.
Il ne faut pas utiliser cette option dans le fichier .htaccess avec tous les codes décrits ci-dessus.
Cette option empêche un navigateur web d’exécuter le script directement.

Créer un fichier .htaccess spécialement pour le dossier à protéger.
Si le navigateur ouvre le fichier index.php qui fait un include() vers un fichier php se trouvant dans le dossier protégé par le code ci-dessous, tout s’exécutera bien.

On protège donc l’exécution directe du fichier par un navigateur quand le pirate essaye d’entrer du code malicieux non filtré.

# Aucun script dans le dossier et ses sous-dossiers, que ce soit PHP, PERL ou autre CGI, ne peut s'executer si ExecCGI est inactif.
# Interdit d'afficher la liste des fichiers.
OPTIONS -ExecCGI  -Indexes

 

Authentification avec un fichier .htaccess

Protéger un dossier avec une une authentification par Login/Mot de passe à l'aide d'un fichier .htpasswd
Il faudra localiser le chemin du fichier sur le serveur pour indiquer le bon emplacement du fichier .htpasswd

AuthName "Accès réservé. Vous devez vous identifier !"
AuthType Basic
Require valid-user
AuthUserFile /path/local/serveur/htdocs/site/visionduweb.com/dossier/.htpasswd

 

Optimiser le référencement avec de bonnes pratiques SEO

Pour conserver le bon référencement passé d'un site et garder son audience, utiliser les règles 301.
Rediriger de manière définitive la page /test/actu.html vers la page /actualites/

RedirectPermanent /test/actu.html  /actualites/

Rediriger de manière définitive le répertoire /articles et toutes ses pages vers le répertoire /actualites/articles/.

RedirectPermanent /articles www.example.com/actualites/articles
#Ou
RewriteRule /articles /actualites/articles [R=301]

Rediriger de manière temporaire le répertoire /outils vers la page /maintenance.htm en utilisant une règle 302.

RewriteRule /outils /maintenance.htm [R=302]

 

Serveur IIS de Microsoft

Le fichier web.config est l'équivalent du .htaccess de Apache pour le serveur HTTP IIS de Microsoft.

 

Bibliographie

Encoder le .htaccess en ANSI pour les plans mutualisés OVH : ICI (1)
Performances et temps de chargement avec Htaccess: ICI
Exemples de redirections avec Htaccess : ICI
Autres exemples avec Htaccess : ICI
FAQ du serveur HTTP Apache : ICI
Protection par .htaccess : ICI

Dire que l’on s’en fiche du droit à la vie privée sous prétexte qu’on a rien à cacher, c’est comme déclarer que l’on se fiche du droit à la liberté d’expression sous prétexte qu’on a rien à dire.
[Edward Snowden]

Visionduweb - La Réponse Collaborative - 2002 / 2019

Condition d'utilisation du site Visionduweb

Vous êtes soumis au règlement suivant et à ce titre ni l'administrateur ni l'hébergeur ne pourraient ni ne seraient tenu pour responsable de vos actes.
Vous ne devez en aucun cas utiliser les informations présentes sur Visionduweb pour nuire à autrui ou à un système informatique.

La licence CC BY-NC-ND 4.0 est attribuée au contenu rédigé par Visionduweb sur les domaines suivants :
www.visionduweb.com www.visionduweb.eu www.visionduweb.fr www.visionduweb.info

Les profils utilisés par Visionduweb : Anonymous, Visionduweb, Zer00CooL

Le serveur et les services sont accessibles.
------------------------------------
------------

Chercher dans ce site

Menu de connexion