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')");
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;--')
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.
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute([ 'name' => $name ]); foreach ($stmt as $row) { // Do something with $row }
$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]); while ($row = $result->fetch_assoc()) { // Do something with $row }
$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 }
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);
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
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.
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!