Comment protéger vos bases de données d’une injection SQL
Pour protéger vos bases de données il existe différentes mesures à mettre en place afin d’éviter des fuites ou des attaques par injection SQL.
S’assurer que le serveur est protégé
La sécurité du serveur sur lequel vos bases de données tournent joue naturellement un rôle important. La première étape est donc de vérifier les points suivants :
- Avoir utilisé la commande basique « mysql_secure_installation » ;
- Installer des paquets uniquement pertinents au bon fonctionnement du système afin d’éviter des portes ouvertes inutilement ;
- Supprimer tous les comptes utilisateurs qui ne sont pas nécessaires ;
- S’assurer que toutes les mises à jour de l’OS et des paquets sont effectuées régulièrement.
Renforcer les bases de données et utiliser des codes sûrs
Les bases de données doivent être débarrassées de tout éléments inutiles. Par ailleurs, pensez à chiffrer vos données sensibles, tel que les mots de passes.
Il est également utile de ne pas utiliser le module PHP mysql mais de choisir à la place « mysqli » ou « PDO », le premier étant déprécié et donc plus soutenu. La fonction PHP mysqli_real_escape_string() permet par exemple d’éviter d’émettre des caractères spéciaux aux bases de données SQL sous leur forme originale.
Voici un exemple concret :
$query = "SELECT * FROM users WHERE username= '" . $_POST['username'] . "' AND password= '" . $_POST['password'] . "'";
Vous devriez sécuriser cette requête de la manière suivante :
$query = "SELECT * FROM users WHERE username= '" . mysqli_real_escape_string($_POST['username']) . "' AND password= '" . mysql_real_escape_string($_POST['password']) . "'";
Les caractères non sécurisés seront automatiquement échappés, cela évite déjà certaines injections SQL.
Créer des conditions
Il est également important en PHP, de penser à vérifier le type et la valeur de la variable reçue.
Si la valeur n’existe pas, ou si la valeur ne correspond pas à un chiffre (par exemple), au début et à la fin (indiqué par les symboles ^ et $) : on sort du programme pour afficher une erreur.
Dans le cas de notre exemple, on s’attend à récupérer un identifiant qui est donc un nombre. Dans un premier temps on vérifie donc si la variable existe et si elle correspond à nos attentes à l’aide d’une expression REGEX :
$id = $_GET["id"]; if ((!$id) || (!ereg("^[0-9]+$", $id))) exit("Pas de page à cette addresse");
Un autre exemple qui permet de vérifier que la variable est bien une suite de caractères en majuscules :
http://www.example.com/page.php?id=ABC
Donc:
$id = $_GET["id"]; if ((!$id) || (!ereg("^[A-Z]+$", $id))) exit("Pas de page à cette addresse");
Si la valeur ne correspond pas à un mot tout en majuscule, sans espace ou autre caractère non permit, on sort du programme.