English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Injection SQL

Dans ce tutoriel, vous apprendrez à corriger les vulnérabilités courantes des bases de données.

Qu'est-ce que l'injection SQL ?

L'injection SQL est une attaque où l'attaquant peut injecter ou exécuter du code SQL malveillant via les données saisies par le serveur d'application via le navigateur (par exemple, les entrées des formulaires Web).

Il peut être utilisé pour rendre publique des informations sensibles, telles que le numéro de téléphone de l'utilisateur, l'adresse e-mail, les informations de carte de crédit, etc. Les attaquants peuvent même l'utiliser pour contourner le processus d'authentification et obtenir l'accès à l'ensemble de la base de données. Voyons comment cela fonctionne.

Comment fonctionne l'injection SQL

Considérez l'instruction SQL suivante, qui est un exemple simple d'authentification des utilisateurs par nom d'utilisateur et mot de passe utilisée dans une application Web.

SELECT * FROM users WHERE username='username_val' AND password='password_val';

ici,username_valetpassword_valreprésentent respectivement le nom d'utilisateur et le mot de passe saisie par l'utilisateur. Si l'utilisateur saisit comme nom d'utilisateur " 123”comme mot de passe

SELECT * FROM users WHERE username='john' AND password='123;

Mais supposons que, si l'utilisateur est un attaquant, il n'a pas saisi de nom d'utilisateur et de mot de passe valides dans le champ d'entrée, mais des valeurs similaires à ce qui suit : ' OR 'x'='x

Dans ce cas, la requête SQL ci-dessus sera construite comme suit :

SELECT * FROM users WHERE username='' OR 'x'='x' AND password='' OR 'x'='x';

Cette instruction est une instruction SQL valide, car WHERE 'x'='x' est toujours true, donc la requête retournerausersToutes les lignes du tableau. Vous pouvez voir que l'attaquant peut accéder facilement à toutes les informations sensibles de la base de données grâce à une petite astuce.

siusersSi la table est grande et contient des millions de lignes, cette seule instruction peut également entraîner une attaque de refus de service (DoS) en surchargeant les ressources système, rendant votre application inutilisable pour les utilisateurs légitimes.

Avertissement :Si votre script génère uneSuppressionouMise à jourSi vous ignorez les conséquences des vulnérabilités d'injection SQL, cela peut être encore plus grave. Les attaquants peuvent supprimer des données du tableau ou modifier toutes les lignes de manière permanente.

Prévenir l'injection SQL

Toujours vérifier les entrées de l'utilisateur, ne faites aucune hypothèse. Ne construez jamais directement des requêtes SQL à partir des entrées de l'utilisateur. Si vous utilisez PHP et MySQL, vous pouvez utiliser la fonction mysqli_real_escape_string() pour créer des chaînes de caractères SQL valides utilisables dans des requêtes SQL.

Ceci est un exemple très basique d'authentification utilisateur utilisant PHP et MySQL, démontrant comment éviter l'injection SQL lors de la récupération des entrées de l'utilisateur.

<?php
// Début de session
session_start();
 
/* Essayer de se connecter au serveur MySQL.
   Supposons que vous utilisiez les paramètres par défaut pour exécuter le serveur MySQL (l'utilisateur 'root' n'a pas de mot de passe) */
$link = mysqli_connect("localhost", "root", "", "demo");
 
// Vérifier la connexion
if($link === false){
    die("Erreur : Impossible de se connecter à la base de données.");
}
 
// Échapper à l'entrée de l'utilisateur pour garantir la sécurité
$username_val = mysqli_real_escape_string($link, $_POST['username']);
$password_val = mysqli_real_escape_string($link, $_POST['password']);
 
if(isset($username_val, $password_val)){
    // Essayer de sélectionner l'exécution de la requête
    $sql = "SELECT * FROM users WHERE username='" . $username_val . "' AND password='" . $password_val . "";
    if($result = mysqli_query($link, $sql)){
        if(mysqli_num_rows($result) == 1{
            // L'utilisateur a été authentifié, veuillez procéder à l'opération ici
            $row = mysqli_fetch_array($result);
            /*Enregistrer les valeurs dans les variables de session.
               de sorte à pouvoir y accéder plus tard dans la même session. */
            $_SESSION['user_id'] = $row['user_id'];
            $_SESSION['first_name'] = $row['first_name'];
            header('Location: welcome.html');
        } else {
            echo "Erreur! Nom d'utilisateur ou mot de passe incorrect.";
        }
    } else {
        echo "Erreur: Un problème est survenu. Veuillez réessayer.";
    }
}
 
// Fermer la connexion - Fermer la connexion
mysqli_close($link);
?>

Astuce :Tester la taille et le type ou le contenu des données reçues par l'application de test, et appliquer des restrictions appropriées pour éviter l'exploitation des ressources système.