Corriger la faille d'injection SQL ! 😠
Dans le leçon précédente, nous avons découvert que notre code présente une faille grave de type injection SQL.
Comment y remédier ?
Protéger notre programme
Il est possible de protéger notre code en corrigeant cette faille.
Et c'est très simple ! 😮💨
Nous allons modifier le code et nous allons utiliser les requêtes préparées.
// Vérifier si les identifiants sont corrects en utilisant les requêtes préparées
$stmt = $db->prepare("SELECT * FROM utilisateurs WHERE user = ? AND password = ?");
$stmt->bind_param("ss", $user, $pass); // 'ss' spécifie que les deux paramètres sont des chaînes (string)
$stmt->execute();
$result = $stmt->get_result();
$result = $result->fetch_all();
Le code à la base est le suivant.
<?php
require_once ('vendor/autoload.php');
// Récupérer les données du formulaire
$user = $_POST['username'] ?? null;
$pass = $_POST['password'] ?? null;
// Informations de connexion à la base de données
$servername = "database";
$username = "henrique";
$password = "CqIEuocUkTClfJyzVfOYcKAzbrHFqH";
$dbname = "injectionDB";
// Se connecter à la base de données
$db = new mysqli($servername, $username, $password, $dbname);
// Vérifier si les identifiants sont corrects
$sql = "SELECT * FROM utilisateurs WHERE user = '$user' AND password = '$pass'";
$result = $db->query($sql);
$result = $result->fetch_all();
// Afficher les utilisateurs si le résultat n'est pas vide
if (count($result) > 0) {
$sql = "SELECT id, user, password FROM utilisateurs";
$result = $db->query($sql);
dump($result->fetch_all());
} else {
dump('Mauvais identifiants ou mauvais mot de passe !');
}
Remplacez les lignes 19 à 22 par le nouveau bout de code.
<?php
require_once ('vendor/autoload.php');
// Récupérer les données du formulaire
$user = $_POST['username'] ?? null;
$pass = $_POST['password'] ?? null;
// Informations de connexion à la base de données
$servername = "database";
$username = "henrique";
$password = "CqIEuocUkTClfJyzVfOYcKAzbrHFqH";
$dbname = "injectionDB";
// Se connecter à la base de données
$db = new mysqli($servername, $username, $password, $dbname);
// Vérifier si les identifiants sont corrects en utilisant les requêtes préparées
$stmt = $db->prepare("SELECT * FROM utilisateurs WHERE user = ? AND password = ?");
$stmt->bind_param("ss", $user, $pass); // 'ss' spécifie que les deux paramètres sont des chaînes (string)
$stmt->execute();
$result = $stmt->get_result();
$result = $result->fetch_all();
// Afficher les utilisateurs si le résultat n'est pas vide
if (count($result) > 0) {
$sql = "SELECT id, user, password FROM utilisateurs";
$result = $db->query($sql);
dump($result->fetch_all());
} else {
dump('Mauvais identifiants ou mauvais mot de passe !');
}
Regardez 🧐, les lignes 19 à 24 ont été changées.
Dans la prochaine leçon, nous allons tester et vérifier si la faille a bien été corrigée.