: Tuto Par :
Le htaccess Part Ouane

Faire un joli HTACCESS, simplement et rapidement un site sous apache

(Valide avec notre ami Wordpress, Hé ouai !)

N.B : je déconseille fortement de copier coller sans lire sinon vous allez tout casser !

Pour beaucoup, faire un site internet c'est limité à ce que que veut bien nous laisser faire notre hébergeur sur leurs serveur mutualisés, et forcé d'avoué que tous les fichiers de configurations d'apache ne peuvent être laissé à porté de main de n'importe quel clampin. La seule solution c'est donc de modifier un fichier un peut spécial, qui à la particularité de ne pas avoir de nom, et comme extension htaccess.

Les dits fichiers sont à placer à coté des fichiers .php ou .html. Ils affectent les fichiers ou dossiers, adjacents et enfants.

Si vous utilisez wordpress de nombreux plugins vous propose de vous l'optimiser, mais franchement c'est pas la peine de mettre ENCORE un plugin pour juste ça, je suis sur que vous en avez déjà pleins. Pas la peine de bourrer encore un peut plus votre CMS, donc pour arranger ça, faut le faire à la main surtout que certaines règles ne peuvent être créer que via vos petites mimines.

Commençons doucement :

Sécurisation

#Pour OVH : SetEnv PHP_VER 5_6

SetEnv REGISTER_GLOBALS 0
SetEnv ZEND_OPTIMIZER 1
Options -Indexes -MultiViews +FollowSymLinks
ServerSignature Off

AddDefaultCharset UTF-8

AddCharset utf-8 .atom .css .js .json .jsonld .rss .vtt .webapp .xml

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

#Pour Wordpress

<files wp-config.php>
	order allow,deny
	deny from all
</files>

En vrac, vous demandez la dernière version de php, vous activez l'optimisation de php, désactivez les variables globales. Les options désactivent l’indexation des dossiers, la recherche de fichier ''intelligente'' et activez les liens symboliques.

Désactivez la signature du serveur.

Forcez les fichiers à utiliser UTF-8 pour les fichiers renseignés.

Et vous interdisez l’accès au fichier htaccess et wp-config.php.

On passe au gros de la sécurisation

1) Le « MIME-Type sniffing »

Votre navigateur il « sniff » vos fichiers pour savoir ce que c'est, problème il peut être manipuler et faire passer une tentative d'intrusion pour une banale image de lolcat, pour s'en protéger c'est pas compliqué :

Header always set X-Content-Type-Options "nosniff"

2)Le « clickjacking »

En gros des petits malin intègre votre site dans le leurs grâce à la balise <iframe> et vous vole ainsi de la visibilité et des revenu publicitaires, pour s'en prévenir :

<IfModule mod_headers.c>
	Header always set X-FRAME-OPTIONS "DENY"
</IfModule>

3) Faille XSS étape Zune

Le XSS permet d'écrire du code qui sera exécuté dans le navigateur à l’attention du serveur cible, vous vous en doutez le code ainsi « Injecté » est là pour tout cassé/voler des données. Il suffis simplement de forcer cette protection :

<IfModule mod_headers.c>	
	Header always set X-XSS-Protection "1; mode=block"
</IfModule>

N.B : <IfModule mod_headers.c> est une petite sécurité qui vérifié la présence d'un composant dans apache avant d’exécuter le code, ainsi si il est manquant le serveur vous implose pas à la face.

4) Faille XSS étape Deuw:

Plus haut on a bloqué l’exécution du code distant. Mais comment le repérer ?

Attention à vous c'est du lourd là.

<IfModule mod_headers.c>
	Header set Content-Security-Policy: "script-src 'self' https://www.google.com"
</IfModule>

Explication :

Header add Content-Security-Policy :

le nom de la règle que l'on défini en ce moment même

"script-src 'self' https://www.google.com"

là cette réglé stipule que pour le javascript on autorise 

	'self' = Nous même, Aka les fichiers .js stockés sur notre serveur.
Et
	les scripts en provenance de http://google.com 

La rédaction de cette règle doit être faite dans le temps et vous devez faire très attention, il est facile de se retrouver avec une page sans css ni javascript !

Les ressources possibles sont :

  • base-uri : Restraint l'utilisation de la balise <base> .
  • child-src : utilisation des iframes
  • connect-src : pour l’identification serveur
  • font-src : Pour les polices d'écritures
  • form-action Pour les formulaires
  • frame-ancestors Concerne l'utilisation des <frame>, <iframe>, <embed> et <applet>
  • frame-src deprécié, utilisez child-src.
  • img-src défini d'ou les images peuvent être chargés.
  • media-src video et audio.
  • object-src pour le Flash .
  • plugin-types Limitation de la source des différents plugins.
  • report-uri On peut définir une adresse qui recevra des rapport, on en limite l’accès ici.
  • style-src C'est pour les feuilles de styles.
  • upgrade-insecure-requests force les re-écritures du http en https, pas forcément très utilisé.

Pour ces ressources plusieurs valeurs sont possibles avec ces jokers disponibles :

  • 'none',comme son nom l'indique, aucun.
  • 'self' permet le chargement pour l'adresse de votre serveur. Ne concerne pas vos sous-domaines
  • 'unsafe-inline' autorise l'utilisation de javascript directement dans une page.
  • 'unsafe-eval' autorise l'utilise d'eval en javascript.

Petit explication de ma règle, je commence avec :

Header add Content-Security-Policy: 

Première règle, de base j’autorise uniquement moi même :

"default-src 'self';

Ensuite j'autorise le chargement de mes ressources :

script-src 'self' 'unsafe-inline' la-cave-a-nodo.fr *.la-cave-a-nodo.fr; 
connect-src 'self';
img-src 'self' https://symphonie-of-code.fr https://la-cave-a-nodo.fr *.la-cave-a-nodo.fr data: *.gravatar.com;
style-src 'self' 'unsafe-inline' fonts.googleapis.com;
font-src 'self' https://la-cave-a-nodo.fr fonts.gstatic.com;"

Si je vous ai pas totalement noyé vous aurez remarqués que pour les images j'ai un règle. data: Sans rentrer dans les détails en html on peut donner une chaine de caractère dans une <img src='data:SDsdtflsef54drgfhkd46serlkjhsef531' /> et une image apparaît.

au final cela ressemble à ça :

Header add Content-Security-Policy: "default-src 'none';script-src 'self' 'unsafe-inline' la-cave-a-nodo.fr *.la-cave-a-nodo.fr;connect-src 'self';img-src 'self' https://symphonie-of-code.fr https://la-cave-a-nodo.fr *.la-cave-a-nodo.fr data: http: https: *.gravatar.com;style-src 'self' 'unsafe-inline' fonts.googleapis.com;font-src 'self' https://la-cave-a-nodo.fr fonts.gstatic.com;"

Pas très ragoutant hein :p

Aller on fini avec simplicité et beauté :

5)Activation du cache

La mise en cache permet d'expliquer gentiment au serveur qu'il n’a pas besoin de vous envoyer toutes les données qui ne change pas tout le temps à chaque visite.

Petite précision il ce peut que quand vous faites des modifications sur votre site vous (ou vos utilisateur) ne voyez plus immédiatement la contenu, le délai reste quand même assez court.

<IfModule mod_expires.c>
	ExpiresActive On 

	ExpiresDefault "access plus 1 year"

	ExpiresByType image/x-icon "access plus 1 year"

	ExpiresByType image/gif "access plus 1 month"
	ExpiresByType image/svg "access plus 1 month"
	ExpiresByType image/png "access plus 1 month"
	ExpiresByType image/jpg "access plus 1 month"
	ExpiresByType image/jpeg "access plus 1 month"
	ExpiresByType text/css "access 1 month"
	ExpiresByType application/javascript "access plus 1 month"
	ExpiresByType application/vnd.ms-fontobject "access plus 1 year"
	ExpiresByType application/x-font-ttf "access plus 1 year"
	ExpiresByType application/x-font-opentype "access plus 1 year"
	ExpiresByType application/x-font-woff "access plus 1 year"
	ExpiresByType image/svg+xml "access plus 1 year"

</IfModule>

Et ici on active la compression Gzip d'apache, Vous connaissez les archives winzip/rar & co ? Votre navigateur peut recevoir une archive Gzip, qui forcément est plus légère qu'en transfert classique.

<IfModule mod_deflate.c>
	AddOutputFilterByType DEFLATE text/plain
	AddOutputFilterByType DEFLATE text/html
	AddOutputFilterByType DEFLATE text/xml
	AddOutputFilterByType DEFLATE text/css
	AddOutputFilterByType DEFLATE application/xml
	AddOutputFilterByType DEFLATE application/xhtml+xml
	AddOutputFilterByType DEFLATE application/rss+xml
	AddOutputFilterByType DEFLATE application/javascript
	AddOutputFilterByType DEFLATE application/x-javascript
	AddOutputFilterByType DEFLATE application/x-font-ttf application/x-font-opentype image/svg+xml
	AddType image/svg+xml .svg
	AddType x-font/otf .otf
	AddType x-font/ttf .ttf
	AddType x-font/eot .eot
	AddType x-font/woff .woff
	AddType image/x-icon .ico
	AddType image/png .png
	AddOutputFilterByType DEFLATE image/svg+xml
	AddType application/vnd.ms-fontobject .eot
	AddType application/x-font-ttf .ttf
	AddType application/x-font-opentype .otf
	AddType application/x-font-woff .woff
	AddType image/svg+xml .svg

	BrowserMatch ^Mozilla/4 gzip-only-text/html
	BrowserMatch ^Mozilla/4\.0[678] no-gzip
	BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
	BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

	SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip
</IfModule>

Ici on indique au navigateur que parfois il luis faut re-télécharger les donnés au cas ou vous les mettez à jours.

<IfModule mod_headers.c>
	<FilesMatch "\\.(jpg|jpeg|png|svg|gif|swf|ogg|ogv|mp4|webm|woff|ttf|odt)$">
		Header set Cache-Control "max-age=2592000, public"
	</FilesMatch>
	<FilesMatch "\\.(ico)$">
		Header set Cache-Control "max-age=604800, public"
	</FilesMatch>
	<FilesMatch "\\. (css|js)$">
		Header set Cache-Control "max-age=31556926, public"
	</FilesMatch>
	<FilesMatch "\\.(|html|json|xml)$">
		Header set Cache-Control "max-age=31556926, public"
	</FilesMatch>	
</IfModule>

Et Voilou ! Vous avez désormais un htaccess pinpé à mort et sécurisé. Le XSS est un gros morceau, et sous wordpress si l'on a pleins d’extensions ça peut vite devenir le dawa inter-nucléaire n'hésitez pas à la laissez tomber si vous vous retrouvez bloqué.

A éditer si j'ai plus de truc ou des correction à faire :D

Dans un prochain article je montrerais comment ce protéger des crawler et autres méchants robots

Avatar de l'utilisateur Nodoka

Nodoka

PedoQueen des intrawebz 2.0, antéchristine de la connerie, j'aime les loli, les vocaloid, l’humour noir (car le blanc est raciste) et les Animés. Promis je te mangerais trollement bien avec amour. Ma devise : "If her age is on the clock, she's old enough for the cock".

Articles Aléatoires

Integration d'OpenGraph

Integration d'OpenGraph

Integrer rapidement a facilement opengraph en html pour facebook et twitter Voir +
Extentions pour firefox pour sa vie privée

Extentions pour firefox pour sa vie privée

Liste d'extension open sources pour proteger sa vie privée sur internet avec firefox Voir +
Faille critique dans open-SSH

Faille critique dans open-SSH

Rapide hot fix pour open SSH à implémenter en attendant plus d'info Voir +

Dernieres Quotes DTC

MacTheZazou: Youpidaki

MacTheZazou: Je suis viré de mon école pendant 3 semaines

MacTheZazou: o /

Maxigregrze: Wat

Maxigregrze: Kestafoutu

MacTheZazou: J'ai fait un flappy bird avec la tête d'un élève

Maxigregrze: Attend, quoi?

Maxigregrze: Tu veux dire que tu as été viré 3 semaines seulement car t'as dev un machin avec la tête d'un élève...?

MacTheZazou: OUI

MacTheZazou: c'est magique hein

Maxigregrze: Je vais construire un temple en ton honneur, je reviens

#19132 - Voir les commentaires

<A3fka> A tous ceux qui pensent qu'ils ont un nom de merde

<A3fka> Sachez-le :

<A3fka> Dans Pokémon version argent, dans l'arène d'Ecorcia, il y a un dresseur qui s'appelle Jean-Loïc.

#19129 - Voir les commentaires

<Kiwi> T'es super mignonne :D

<Elise> Tu es sérieux? :x

<Elise> Tu penses que j'suis jolie ? :x

<Kiwi> Mais oui

<Kiwi> j'en suis même complètement dur

<Kiwi> sur*

#14161 - Voir les commentaires

(Par the despered)

Dédicace à tous les Jean Loïc de la vraie vie.