Maison > base de données > tutoriel mysql > `mysqli_real_escape_string` est-il suffisant pour empêcher l'injection SQL ?

`mysqli_real_escape_string` est-il suffisant pour empêcher l'injection SQL ?

DDD
Libérer: 2024-12-17 20:30:19
original
221 Les gens l'ont consulté

Is `mysqli_real_escape_string` Sufficient to Prevent SQL Injection?

mysqli_real_escape_string est-il suffisant pour empêcher l'injection SQL ?

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."')";
Copier après la connexion

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);
Copier après la connexion

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);
Copier après la connexion

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal