Corriger la faille d'injection SQL ! 😠

Vidéo sur Youtube Le play Youtube

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.