L'injection SQL fait référence à l'attaquant insérant le code SQL malveillant dans des requêtes SQL pour atteindre le but de voler, de falsifier les données et même de contrôler le serveur de base de données. Par exemple, si un développeur épisque directement l'entrée de l'utilisateur dans une instruction SQL Query, un attaquant peut modifier la logique de requête en entrant un code SQL spécifique.
Par exemple, supposons qu'il existe la déclaration de requête suivante:
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
Si l'attaquant entre les éléments suivants en tant que nom d'utilisateur ou mot de passe:
Nom d'utilisateur: 'ou' 1 '=' 1
Mot de passe: 'ou' 1 '=' 1
Cette déclaration de requête devient:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '' OR '1'='1';
Cela contourne l'authentification normale et les attaquants peuvent facilement obtenir des données sensibles. Pour éviter cela, nous pouvons utiliser des requêtes paramétrées (instructions préparées) pour protéger l'application des attaques d'injection SQL.
L'OPD fournit un mécanisme puissant pour empêcher l'injection de SQL, à savoir les déclarations préparées . Avec les instructions de prétraitement, la saisie de l'utilisateur dans la requête est traitée comme un paramètre plutôt que comme faisant partie du code SQL, de sorte que la base de données ne l'exécute pas même si l'utilisateur entre dans le code SQL malveillant.
Tout d'abord, vous devez vous connecter à la base de données à l'aide de l'APD. Assurez-vous que la gestion des exceptions est activée lors de la création d'une connexion, qui peut mieux déboguer les erreurs.
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo "La connexion de la base de données a échoué: " . $e->getMessage();
}
Les instructions de prétraitement de PDO empêchent non seulement l'injection SQL, mais améliorent également les performances de la requête, en particulier lorsque plusieurs requêtes du même type sont exécutées.
Supposons que nous ayons une requête qui doit récupérer les données de l'utilisateur en fonction du nom d'utilisateur de l'utilisateur. Nous pouvons utiliser le code suivant:
$sql = "SELECT * FROM users WHERE username = :username";
$stmt = $pdo->prepare($sql);
// Lier les paramètres
$stmt->bindParam(':username', $username, PDO::PARAM_STR);
// Exécuter une requête
$stmt->execute();
// Obtenez les résultats de la requête
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Résultat de sortie
foreach ($results as $row) {
echo "nom d'utilisateur: " . $row['username'] . "<br>";
echo "Mail: " . $row['email'] . "<br>";
}
Dans le code ci-dessus, le nom d'utilisateur est un espace réservé, et le nom d'utilisateur entré par l'utilisateur sera lié à l'espace réservé via la méthode BindParam . Cette méthode garantit que peu importe ce que l'utilisateur entre, il sera transmis à la base de données en tant que paramètre au lieu d'être épissé directement dans la requête SQL, empêchant efficacement l'injection SQL.
La méthode PDOSTATION :: Fetchall peut renvoyer les résultats de la requête en tant que tableau. Il est idéal pour obtenir plusieurs lignes de données. Fetchall (PDO :: fetch_assoc) dans le code ci-dessus renvoie le résultat de la requête sous la forme d'un tableau associatif, où chaque élément correspond à une ligne de données.
Si vous souhaitez obtenir tous les résultats de la requête, vous pouvez utiliser la méthode suivante:
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
Si vous n'avez besoin que d'un résultat de ligne unique, vous pouvez utiliser la méthode Fetch , et si vous souhaitez obtenir plusieurs résultats de ligne, Fetchall est un bon choix.
Les instructions de prétraitement doivent toujours être utilisées lors du traitement de l'entrée des utilisateurs, en particulier les paramètres d'URL. Par exemple, lorsque l'URL contient un certain paramètre ID , il doit éviter d'épisser directement dans les instructions SQL, mais le passer par des instructions de prétraitement.
En supposant qu'un paramètre ID est transmis dans l'URL, vous pouvez utiliser le code suivant pour effectuer une requête sécurisée:
$id = $_GET['id']; // Obtenir URL Interne id paramètre
$sql = "SELECT * FROM users WHERE id = :id";
$stmt = $pdo->prepare($sql);
// Lier les paramètres
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
// Exécuter une requête
$stmt->execute();
// Obtenez les résultats de la requête
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
Étiquettes associées:
SQL