Question :
Dans le PHP fourni code, l'utilisation de mysqli_real_escape_string est-elle suffisante pour empêcher l'injection SQL attaques ?
$email= mysqli_real_escape_string($db_con,$_POST['email']); $psw= mysqli_real_escape_string($db_con,$_POST['psw']); $query = "INSERT INTO `users` (`email`,`psw`) VALUES ('".$email."','".$psw."')";
Réponse :
Non, s'appuyer uniquement sur mysqli_real_escape_string ne suffit pas pour empêcher l'injection SQL et d'autres attaques SQL.
Préparé Les instructions fournissent une solution plus robuste pour empêcher l’injection SQL. Ils séparent les données et les instructions, garantissant que les entrées fournies par l'utilisateur n'interfèrent pas avec la structure de la requête.
Pour les situations où les instructions préparées ne peuvent pas être utilisées, la mise en œuvre d'une liste blanche stricte à des fins spécifiques peut offrir une certaine protection. Cela implique de définir une liste prédéterminée de valeurs acceptables pour chaque paramètre afin d'éviter toute saisie malveillante.
Exemple d'utilisation d'une liste blanche et d'un transtypage :
switch ($sortby) { case 'column_b': case 'col_c': // Safe to use break; default: $sortby = 'rowid'; } $start = (int) $start; $howmany = (int) $howmany; if ($start < 0) { $start = 0; } if ($howmany < 1) { $howmany = 1; } // Execute the query using prepared statements $stmt = $db->prepare( "SELECT * FROM table WHERE col = ? ORDER BY {$sortby} ASC LIMIT {$start}, {$howmany}" ); $stmt->execute(['value']); $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
Il est essentiel de s'assurer que les instructions préparées sont utilisées avec les préparations émulées sont désactivées, en particulier lors de l'utilisation de MySQL.
$db->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
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!