Maison >développement back-end >tutoriel php >Comment les instructions préparées peuvent-elles empêcher les attaques par injection SQL dans les applications PHP ?
Prévenir les attaques par injection SQL en PHP
Dans les applications Web, les entrées des utilisateurs peuvent souvent conduire à des vulnérabilités, telles que l'injection SQL, si elles ne sont pas gérées correctement. L'injection SQL se produit lorsque les données fournies par l'utilisateur sont directement incluses dans les instructions SQL sans validation ou nettoyage approprié.
Le problème
Considérez l'extrait de code PHP suivant :
$unsafe_variable = $_POST['user_input']; mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
Si un utilisateur saisit des données malveillantes comme une valeur'); DROP TABLE table ;--, la requête SQL devient :
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Cela entraînerait la suppression par l'utilisateur malveillant de la table entière de la base de données.
Solution : instructions préparées et Paramétrage
La solution recommandée pour empêcher les injections SQL consiste à séparer les données de SQL en utilisant des instructions préparées et des requêtes paramétrées. Cela garantit que les entrées de l'utilisateur sont traitées comme des données et non comme des commandes exécutables.
Utilisation de PDO
PDO fournit une interface cohérente et universelle à divers pilotes de base de données. Pour utiliser des instructions préparées avec PDO :
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(['name' => $name]); foreach ($stmt as $row) { // Do something with $row }
Utilisation de MySQLi
Pour MySQL spécifiquement, MySQLi propose la méthode execute_query() en PHP 8.2 :
$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]); while ($row = $result->fetch_assoc()) { // Do something with $row }
Ou, dans les versions PHP antérieures à 8.2 :
$stmt = $db->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name); // 's' specifies the variable type as string $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // Do something with $row }
Pour les autres pilotes de base de données, reportez-vous à leur documentation spécifique.
Configuration appropriée de la connexion
Pour garantir une véritable protection, il est crucial de configurer correctement la connexion à la base de données :
PDO
Désactiver l'émulation préparée déclarations :
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
MySQLi
Activer le rapport d'erreurs et définir le jeu de caractères :
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); $dbConnection = new mysqli('127.0.0.1', 'username', 'password', 'test'); $dbConnection->set_charset('utf8mb4');
Explication
Les instructions préparées sont analysées et compilées par le serveur de base de données, tandis que les paramètres sont traités comme des valeurs distinctes. Cela empêche les entrées malveillantes d'être interprétées comme des commandes.
Conclusion
En utilisant des instructions préparées et un paramétrage, vous pouvez protéger efficacement vos applications Web PHP contre les attaques par injection SQL et maintenir intégrité des données.
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!