Après un premier article sur l’utilisation du Htaccess pour ce qui concerne l’url rewriting nous allons voir d’autres notions sur ce fichier en ce qui concerne la sécurité par exemple. Comment protéger un peu plus son serveur.
Protéger des dossiers et fichiers
Pour éviter quelques intrusions dans votre serveur il peut être utile de protéger des accès sur des fichiers de configuration ou même des dossiers qui pourraient rediriger vers les statistiques de votre site par exemple.
<files config.php> Order deny,allow deny from all </files>
Ou
ErrorDocument 401 /…/ma_page.html
En indiquant le code d’erreur
401 : Authorization required
403 : Forbidden
404 : Not Found
406 : Request Timed Out
500 : Internal Server Error
503 : Service Unavailable
Ces quelques lignes toutes simple empêcheront à des visiteurs d’accéder à votre fichier. En théorie il est impossible de voir le contenu du fichier php, mais cela peut être utilisé pour tout autre fichier comme des fichiers de configuration en xml par exemple.
Protéger un dossier avec un htaccess
Ce petit bout de code aura pour but de limiter l’accès à Utilisateur1 et Utilisateur2, pour accéder au dossier ou se trouve le htaccess. Pour les mots de passe ils devront être contenu dans le htpasswd de la forme
Utilisateur1:IXRs1NmsgJr
Qui correspond à Utilisateur:MotdePasseCrypté
Protéger son serveur des bots, hotlinking et aspirateurs de site
Il est possible de réduire les risques d’injection sql via les urls de votre site, pour cela quelques règles bien utiles.
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]
#the following rules can block some off your url, in case of problem try to suppress them one per one until you solve it
RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)http%3a(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)ftp(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)ht%20tp(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)htt%20p(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)http%20(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)(%3D|=|%3A|%09)h%20ttp(%3A|:)(/|%2F){2}(.*)$ [NC,OR]
#end of potential issue rules
RewriteCond %{QUERY_STRING} ^(.*)base64_encode(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)GLOBALS(=|[|%[0-9A-Z]{0,2})(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)_REQUEST(=|[|%[0-9A-Z]{0,2})(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)_vti(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)MSOffice(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)/etc/passwd(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)//(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)ShellAdresi.TXT(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^(.*)\[evil_root\]?(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)\.\./\.\./\.\./(.*)$ [OR]
RewriteCond %{QUERY_STRING} ^(.*)/proc/self/environ(.*)$ [OR] RewriteCond %{QUERY_STRING} ^(.*)(SELECT|INSERT|DELETE|CHAR\(|UPDATE|REPLACE)(.*)$ [NC]
#Block out any script trying to set a mosConfig value through the URL
RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|%3D) [OR]
# Block out any script trying to base64_encode crap to send via URL
RewriteCond %{QUERY_STRING} base64_encode.*(.*) [OR]
# Block out any script that includes a < script> tag in URL
RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR]
# Block out any script trying to set a PHP GLOBALS variable via URL
RewriteCond %{QUERY_STRING} GLOBALS(=|[|%[0-9A-Z]{0,2}) [OR]
# Block out any script trying to modify a _REQUEST variable via URL
RewriteCond %{QUERY_STRING} _REQUEST(=|[|%[0-9A-Z]{0,2}) [OR]
# Block out any script that tries to set CONFIG_EXT (com_extcal2 issue)
RewriteCond %{QUERY_STRING} CONFIG_EXT([|%20|%5B).*= [NC,OR]
# Block out any script that tries to set sbp or sb_authorname via URL (simpleboard)
RewriteCond %{QUERY_STRING} sbp(=|%20|%3D) [OR]
RewriteCond %{QUERY_STRING} sb_authorname(=|%20|%3D)
# Send all blocked request to homepage with 403 Forbidden error!
Hotlinking
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?mysite\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpe [L]
Optimisation du serveur
Grâce à ce fichier htaccess il est aussi possible d’améliorer quelques performances de votre serveur en définissant quelques règles.
Tout d’abord vous allez mettre en cache tous ces types de fichiers pendant une certaine durée, ce qui permettra au navigateur d’utilisé le c ache et de ne pas faire d’appel au serveur.
Mise en cache des fichiers
#requires mod_expires ExpiresActive On
ExpiresByType text/html « access plus 30 seconds »
ExpiresByType text/css « access plus 2 weeks »
ExpiresByType text/javascript « access plus 2 weeks »
ExpiresByType image/png « 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 »
Etags
Les Etags ont pour but de signifier au navigateur d’utiliser le cache plutôt qu’interroger le serveur, il arrive certaines fois où il y a des erreurs et la bande passante sera utilisé inutilement. Pour y remédier autant désactiver les Etags avec le code suivant.
<ifModule mod_headers.c> Header unset ETag </ifModule> FileETag None
Mod Gzip
La compression Gzip aura pour but de réduire la taille de vos fichiers qui transite de votre serveur au navigateur. Cela limitera encore la bande passante utilisé pour améliorer les performances globales du site
<ifModule mod_gzip.c> mod_gzip_on Yes mod_gzip_dechunk Yes mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$ mod_gzip_item_include handler ^cgi-script$ mod_gzip_item_include mime ^text/.* mod_gzip_item_include mime ^application/x-javascript.* mod_gzip_item_exclude mime ^image/.* mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.* </ifModule>
Mod Deflate
Le mod deflate est une variante du mod Gzip concernant la compression à la volée des fichiers.
<IfModule mod_deflate.c> <FilesMatch "\.(js|css)$"> SetOutputFilter DEFLATE </FilesMatch> </IfModule>

Merci beaucoup pour ces deux tuto très complets.