Maison >développement back-end >tutoriel php >Qu'est-ce que l'injection SQL ? et comment prévenir
Il s'agit d'une attaque de sécurité courante dans les systèmes de bases de données qui utilisent SQL (Structured Query Language) comme langage de gestion de bases de données. Cette attaque se produit lorsqu'un attaquant injecte du code SQL malveillant dans des champs de saisie utilisateur, tels que des champs de formulaire ou des URL, pour accéder ou modifier de manière inappropriée des données dans une base de données.
SQL Injection se classe n°3 dans le Top 10 OWASP 2021, une liste des vulnérabilités de sécurité les plus courantes et les plus importantes pour les applications Web par l'Open Web Application Security Project (OWASP). Elle est mise à jour à chaque fois. sur plusieurs années pour refléter l'évolution des cybermenaces
Les attaques par injection SQL sont classées comme la menace n°3, démontrant l'importance et la prévalence de ce problème en termes de sécurité des applications Web. Bien gérer les attaques par injection est essentiel pour sécuriser les systèmes d’information et prévenir les accès indésirables
Les attaques par injection SQL peuvent être effectuées de différentes manières, mais il y en a deux les plus courantes :
Supposons qu'il existe une application Web qui permet aux utilisateurs de se connecter, avec du code PHP
<?php $username = $_POST['username']; $password = $_POST['password']; $query = "SELECT * FROM users WHERE username='$username' AND password='$password'"; $result = mysqli_query($conn, $query); if (mysqli_num_rows($result) > 0) { echo "Login successful!"; } else { echo "Invalid username or password."; } ?>
Ce code est vulnérable car l'insertion de valeurs utilisateur directement dans des instructions SQL peut provoquer une injection SQL
Les pirates peuvent insérer des valeurs malveillantes dans des champs comme celui-ci
Cela fait ressembler l'instruction SQL à ceci
SELECT * FROM users WHERE username='' OR '1'='1' AND password='' OR '1'='1'
Parce que '1'='1' est une condition qui est toujours vraie. Cette commande renvoie des informations pour chaque utilisateur de la base de données. Cela permet aux pirates de se connecter sans utiliser de vrai mot de passe
Il existe plusieurs façons d'empêcher l'injection SQL, telles que
<?php $stmt = $conn->prepare("SELECT * FROM users WHERE username=? AND password=?"); $stmt->bind_param("ss", $username, $password); $username = $_POST['username']; $password = $_POST['password']; $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { echo "Login successful!"; } else { echo "Invalid username or password."; } ?>
Dans cet exemple, l'instruction SQL est préparée à l'avance et les valeurs $username et $password sont insérées ultérieurement dans l'instruction. Cela rend impossible l'injection de code SQL malveillant
SQL Injection est une menace sérieuse. Mais cela peut être évité en écrivant du code sécurisé, par exemple en utilisant des instructions préparées et en validant les entrées. Une bonne protection ne permet pas seulement de protéger vos données. Mais cela permet également de maintenir la fiabilité du système.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!