Maison > développement back-end > tutoriel php > Comment les instructions préparées peuvent-elles empêcher l'injection SQL en PHP ?

Comment les instructions préparées peuvent-elles empêcher l'injection SQL en PHP ?

Susan Sarandon
Libérer: 2025-01-01 09:08:11
original
406 Les gens l'ont consulté

How Can Prepared Statements Prevent SQL Injection in PHP?

Protection contre l'injection SQL en PHP

Lors de l'intégration des entrées utilisateur dans des requêtes SQL sans précautions appropriées, une vulnérabilité du code à l'injection SQL apparaît. Considérez l'extrait de code vulnérable suivant :

$unsafe_variable = $_POST['user_input']; 

mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
Copier après la connexion

Ce scénario peut être exploité via une chaîne de saisie utilisateur, telle que value'); DROP TABLE table;--, conduisant à une requête malveillante :

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Copier après la connexion

Stratégies de prévention

Pour éviter de telles attaques, il est impératif de séparer les données de SQL, en garantissant que les données sont traitées comme des données et non interprétés comme des commandes par l'analyseur SQL. Les instructions préparées avec des requêtes paramétrées offrent une solution robuste, séparant les valeurs de l'instruction SQL et des paramètres. Le serveur de base de données analyse et compile l'instruction SQL, traitant les paramètres comme des chaînes, bloquant ainsi efficacement les tentatives d'injection SQL malveillantes.

Implémentation des instructions préparées

PDO

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute([ 'name' => $name ]);

foreach ($stmt as $row) {
    // Do something with $row
}
Copier après la connexion

MySQLi pour MySQL (PHP 8.2)

$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]);
while ($row = $result->fetch_assoc()) {
    // Do something with $row
}
Copier après la connexion

MySQLi pour MySQL (jusqu'à PHP 8.1)

$stmt = $db->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name); // 's' specifies the variable type => 'string'
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // Do something with $row
}
Copier après la connexion

Précautions supplémentaires pour PDO et MySQLi

PDO

Par défaut, PDO utilise des instructions préparées émulées. Pour désactiver l'émulation et appliquer de véritables instructions préparées pour MySQL, définissez :

$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
Copier après la connexion

MySQLi

De même, définissez :

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // error reporting
$dbConnection = new mysqli('127.0.0.1', 'username', 'password', 'test');
$dbConnection->set_charset('utf8mb4'); // charset
Copier après la connexion

Comprendre les instructions préparées

Les instructions préparées sont analysées et compilées par le serveur de base de données lors de leur exécution. Les paramètres indiquent au moteur de base de données où appliquer les filtres. Lors de l'exécution de l'instruction préparée avec des valeurs, l'instruction compilée est combinée avec ces valeurs, et non avec une chaîne SQL. Cela empêche l'injection de chaînes malveillantes qui pourraient conduire à une exécution SQL involontaire.

Avertissements

Les instructions préparées ne conviennent pas aux requêtes dynamiques où la structure de la requête est modifiée. Dans de tels cas, un filtre de liste blanche limitant les valeurs possibles doit être utilisé.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal