Maison > Article > développement back-end > Sécuriser les applications PHP contre les attaques par injection SQL
Le blocage des attaques par injection SQL est crucial pour maintenir la sécurité de vos applications PHP. L'injection SQL est une vulnérabilité qui permet aux attaquants d'exécuter du code SQL arbitraire sur votre base de données, entraînant potentiellement des violations ou des pertes de données. Voici un guide étape par étape pour prévenir les attaques par injection SQL en PHP, accompagné d'exemples et de descriptions pratiques.
L'injection SQL se produit lorsque les entrées de l'utilisateur ne sont pas correctement nettoyées et incorporées dans les requêtes SQL. Par exemple, si un utilisateur saisit du code SQL malveillant, il pourrait manipuler votre requête pour effectuer des actions involontaires.
Exemple d'injection SQL :
// Vulnerable Code $user_id = $_GET['user_id']; $query = "SELECT * FROM users WHERE id = $user_id"; $result = mysqli_query($conn, $query);
Si user_id est défini sur 1 OU 1=1, la requête devient :
SELECT * FROM users WHERE id = 1 OR 1=1
Cette requête renverra toutes les lignes de la table des utilisateurs car 1=1 est toujours vrai.
Les instructions préparées constituent une défense clé contre l'injection SQL. Ils séparent la logique SQL des données et garantissent que les entrées de l'utilisateur sont traitées comme des données plutôt que comme du code exécutable.
Utilisation de MySQLi avec des instructions préparées :
$conn = new mysqli("localhost", "username", "password", "database"); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); }
$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $user_id); // "i" indicates the type is integer
$user_id = $_GET['user_id']; $stmt->execute();
$result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // Process results }
$stmt->close(); $conn->close();
Exemple complet :
<?php // Database connection $conn = new mysqli("localhost", "username", "password", "database"); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // Prepare statement $stmt = $conn->prepare("SELECT * FROM users WHERE id = ?"); if ($stmt === false) { die("Prepare failed: " . $conn->error); } // Bind parameters $user_id = $_GET['user_id']; $stmt->bind_param("i", $user_id); // Execute statement $stmt->execute(); // Get results $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { echo "User ID: " . $row['id'] . "<br>"; echo "User Name: " . $row['name'] . "<br>"; } // Close statement and connection $stmt->close(); $conn->close(); ?>
Les objets de données PHP (PDO) offrent une protection similaire contre l'injection SQL et prennent en charge plusieurs systèmes de bases de données.
Utilisation de PDO avec des instructions préparées :
try { $pdo = new PDO("mysql:host=localhost;dbname=database", "username", "password"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("Connection failed: " . $e->getMessage()); }
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->bindParam(':id', $user_id, PDO::PARAM_INT); $user_id = $_GET['user_id']; $stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($results as $row) { echo "User ID: " . $row['id'] . "<br>"; echo "User Name: " . $row['name'] . "<br>"; }
Exemple complet :
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Prepare statement $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id"); // Bind parameters $user_id = $_GET['user_id']; $stmt->bindParam(':id', $user_id, PDO::PARAM_INT); // Execute statement $stmt->execute(); // Fetch results $results = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($results as $row) { echo "User ID: " . $row['id'] . "
"; echo "User Name: " . $row['name'] . "
"; } } catch (PDOException $e) { die("Error: " . $e->getMessage()); } ?>
Le blocage des attaques par injection SQL est crucial pour sécuriser vos applications PHP. En utilisant des instructions préparées avec MySQLi ou PDO, vous vous assurez que les entrées utilisateur sont traitées en toute sécurité et ne sont pas exécutées dans le cadre de vos requêtes SQL. Le respect de ces bonnes pratiques contribuera à protéger vos applications contre l’une des vulnérabilités Web les plus courantes.
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!