Comment améliorer la sécurité d’un site utilisant le langage PHP ?

Mathieu Chartier Programmation 0 commentaire

Comment sécuriser facilement un site en langage PHP ?

Il existe des astuces parfois simples qui permettent de freiner les pirates informatiques ou tout simplement de les envoyer vers de mauvaises pistes. Comme je le dis souvent, les très bons pirates (donc rares) sont difficilement dupés, mais la très large majorité des hackers ne sont que des fans d'attaques par brute force, failles XSS ou injections SQL. Pour d'autres, cela passe par des attaques DDOS visant à surcharger le serveur, mais cela est plus rare pour les petits sites web.

Comme nous ne pourrons pas empêcher tous les piratages, il peut toutefois être bon de freiner les ardeurs de certains pirates du dimanche (la grande majorité comme je l'ai déjà dit) pour les sites qui utilisent le langage PHP. Pour ce faire, plusieurs méthodes simples peuvent vous aider à duper les hackers, soit en masquant des informations sur le serveur, soit en se faisant passer pour un autre langage, par exemple.

Paramétrer expose_php dans php.ini

La première étape concerne les utilisateurs qui peuvent modifier le fichier de configuration php.ini sur leur serveur. Nul besoin d'être en hébergement dédié ou avec un VPS, il arrive que des hébergements mutualités proposent quelques modifications d'options du php.ini. C'est notamment mon cas chez o2Switch par exemple, et de mémoire, c'est le cas chez LWS aussi voire Easy Hebergement (que je déconseille vivement).

Il convient de mettre l'option expose_php sur Off et non sur On (par défaut en général). Cela a pour objectif de masquer quelques informations qui pourraient être utiles pour les pirates, comme la version de PHP utilisée, etc.

Ainsi, plus aucune entête HTTP ne renvoie la version PHP utilisée, ni même si le serveur utilise le module du langage. Et depuis PHP 5.5, plus aucune information sur le logo PHP n'est renvoyée, donc c'est parfait ainsi...

N'oubliez pas de régler l'option display_errors sur Off également, car un pirate pourrait volontairement générer une erreur pour trouver le langage utilisé, les failles potentielles, etc.

Paramétrer Apache ou un fichier.htaccess

Il est possible de procéder à un masquage quasi total des informations sur les serveurs Apache, en configurant votre fichier httpd.conf ou un fichier .htaccess. Deux directives peuvent être modifiées pour cela, en toute simplicité :

  • ServerTokens : contrôle la réponse de l'entête Server renvoyée au client.
  • ServerSignature : ajoute une signature en "pied de page" pour les pages générées par le serveur, en affichant notamment la version d'Apache utilisée.

Il convient de placer ServerTokens sur la valeur "Prod" pour n'afficher que "Apache", et rien d'autres. Cela masque notamment la version d'Apache utilisée mais aussi les éventuels modules installés (dont PHP !). Il faut aussi ajouter ServerSignature Off pour masquer les signatures de bas de page. Voici donc un résumé :

# Réduit les informations affichées dans l'entête Server
ServerTokens Prod

# Supprime la signature ajoutée dans les pages générées par le serveur
ServerSignature Off

L'autre astuce consiste à duper les hackers en nomment les fichiers avec une fausse extension, soit existante, soit totalement inventée. Par exemple, vous pourriez très bien indiquer une extension .py (Python), .pl (Perl), .aspx (ASP.Net de Microsoft), ou même .rb (Ruby) alors qu'en réalité, vos pages sont développées en PHP pur et dur. Mais cela fonctionne également avec des extensions totalement créées pour l'occasion.

J'avoue qu'indiquer .aspx ne serait pas la meilleure des idées car il suffit d'une extension de navigateur comme Wappalyzer pour montrer qu'il s'agirait d'un serveur Apache ou Nginx, n'acceptant donc pas les technologies de Microsoft (seul IIS accepte ASP et ASP.Net). Il est bon de duper les hackers, mais peut-être d'être moins malins que certains d'entre eux... ^^

Il suffit d'ajouter une ligne dans un fichier .htaccess ou dans la configuration Apache pour personnaliser l'affichage des extensions de sites web. Voici plusieurs cas différents :

# Duper en affichant des extensions d'un autre langage
AddType application/x-httpd-php .py .pl .rb .aspx

# Ajouter plutôt une extension HTML native à la place de PHP
AddType application/x-httpd-php .htm .html .xhtml .phtml
# Ajouter une extension inventée
AddType application/x-httpd-php .pro .top .hacker .joke .000

Sachez que si vous changez les extensions PHP natives par autre chose, il faut bien retenir deux choses :

  1. Il convient de modifier les extensions des fichiers PHP du site selon vos modifications, pour que les paramètres côté serveur correspondent à vos fichiers hébergés.
  2. Le fait d'opter pour un masquage avec HTML peut ralentir un peu le serveur car toutes les pages HTML seront alors interprétées par le moteur PHP...

Cela ne va pas permettre de tout éviter, mais au moins de limiter les attaques par PHP. En effet, en masquant les versions utilisées par Apache et PHP, c'est aussi certaines failles potentielles qui sont potentiellement cachées. Et en changeant les extensions, il est possible d'envoyer certains pirates vers de fausses pistes.

L'autre astuce consiste à renvoyer un entête X-Powered-By totalement faussé, avec la fonction header() par exemple :

// Fait semblant d'utiliser du Python 3 alors qu'il s'agit de PHP
header("X-Powered-By: Python 3");

Si toutefois vous préférez la méthode des URL sans extension, comme sur ce blog par exemple (même si cela est géré par WordPress ici) ou sur mon site d'agence (www.internet-formation.fr), sachez qu'il est possible d'ajouter ces quelques lignes dans un fichier .htaccess ou dans votre configuration Apache. Cela permet notamment de rediriger les malfaisants utilisant les URL avec extension PHP vers une page d'erreur, même si cette page existe réellement...

# Active la réécriture d'URL
RewriteEngine on

# Réécrit les URL avec extension comme /rep/page.php en /rep/page
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
# Retourne une erreur 404 si l'on tente une URL avec extension PHP
RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$"
RewriteRule .* - [L,R=404]

Voilà, ce ne sont que quelques astuces mais toujours bonnes à prendre lorsque l'on veut protéger un minimum nos sites web utilisant le langage PHP en relativement peu d'efforts...