1. Protégez vos requêtes SQL

Afin d’éviter les injections sql, il est primodial de protéger l’intégralité vos requetes effectuées via mysql_query() de toute utilisation malveillante. En clair, dès que vous passez une variable php dans une requête, que ce soit un SELECT, INSERT, UPDATE, etc. protégez là ! Pour ce faire il existe pas mal de méthodes différentes, plus ou moins bonnes, mais la plus simple, la plus rapide et la plus efficace à utiliser est la fonction mysql_real_escape_string(), ex:

mysql_query("SELECT * FROM toto 
WHERE champ='".mysql_real_escape_string($variable_a_proteger)."'");

note: Si vous utilisez cette fonction et que les guillemets magiques sont activés par défaut sur votre serveur (90% du temps en mutualisé) vous effectuerez un double échappement de certains caractères, un ‘\’ sera par ex. ajouté à tous les apostrophes, guillements & co avant les insertions en base. Cela allourdira votre base de données pour rien et vous obligera à faire un stripslashes() des valeurs inutile en sortie. Si actif la fonction get_magic_quotes_gpc() renverra la valeur 1.


2. Protéger les variables en sortie

Afin d’éviter tout modification de vos variables en sortie (injection php), il est impératif de les protéger également de toute implémentation malveillante. Cette fois-ci nous utiliserons la fonction htmlentities() pour du texte, et intval() pour des valeurs numériques entières. ex:

echo "bonjour ".htmlentities($nom).", vous avez ".intval($age)." ans.";


3. Interdire les includes de pages externes

Pour éviter qu’un code malveillant soit excécuté sur votre site A à partir d’un site B (via une faille XSS par exemple), interdisez purement et simplement les includes de pages extérieurs au site, ex:

http://www.monsite-A.com/mapage.php?id=http://www.site-B.com/pagedattaque.php.

Cela se passe dans un fichier .htaccess à éditer (sil y en a déjà un) ou à ajouter (si ce n’est pas le cas) à la racine de votre site. Placez-y les règles de réécritures suivantes:

RewriteEngine on RewriteCond %{QUERY_STRING} ^(.*)http(\:|\%3A)(.*)$ ReWriteRule .* - F

Une erreur 403 (accès interdit) sera alors retournée pour toute tentative de ce type.


4. N’affichez pas les erreurs php/mysql

Autant cela est très utile en dev’, autant il est suicidaire de laisser les messages d’erreurs générés par php/mysql en prod! Pourquoi? Car si une erreur se de ce type se produit vous afficherez ni plus ni moins aux internautes que les noms de champs de vos tables, des données pour le moins… sensibles ! Bref enlevez l’instruction ‘or die mysql_error()’ (et associés) de vos requêtes.

Si vous êtes sur un serveur dédié, paramétrez le fichier de configuration php.ini en conséquence.


5. Protégez votre fichier de connexion SQL

Si vous avez bien fait votre boulot, vous ne devez avoir qu’un seul fichier de connexion sql centralisant les codes d’accès à votre bdd pour tout votre site. Afin de prévenir tout risque de piratage de ce fichier une règle simple consiste à lui donner un nom impossible à deviner. Exit donc les config.php, connexion.php & co. , préférez un nom ‘barbare’ m’élangeant majuscules, minuscules et chiffres. Idéalement faites en sorte qu’il fasse entre 6-12 caractères, par exemple _BdD-0ConFiG.php


6. Interdisez le listage de vos répertoires

Pour finir, et dans le même genre que le point précédent il est préférable que vos visiteurs n’aient aucune possibilité de lister les fichiers listés dans vos répertoires, il serait facheux pour vous qu’un pirate y découvre des fichiers d’include importants, et que d’une façon x ou y parvienne à s’en servir pour hacker tout ou partie du site. Il est pourtant très simple de s’en prémunir : a) en ajoutant un fichier d’index vide dans chaque répertoire, b) en ajoutant la ligne de redirection suivante dans votre fichier .htaccess:

ErrorDocument 403 /erreur.htm

Toute personne tentant de lister l’un de vos répertoires sera immédiatement et systématiquement redirigé vers votre page erreur.htm.

Voilà , ce petit tutoriel est terminé, j’espère qu’il vous sera utile! Il y aurait beaucoup de choses à ajouter mais c’est une bonne base pour débuter. :)
Notez par ailleurs qu’un certain nombre d’options liées à la sécurité sont également définies dans la configuration de php.