Position actuelle: Accueil> Derniers articles> mysqli :: $ insert_id: comment éviter les problèmes de sécurité pendant l'injection SQL

mysqli :: $ insert_id: comment éviter les problèmes de sécurité pendant l'injection SQL

gitbox 2025-05-29

Dans le développement de PHP, l'utilisation de MySQLI pour étendre le fonctionnement des bases de données est une manière courante et efficace. Surtout après avoir effectué l'opération d'insertion, nous utilisons généralement $ mysqli-> insert_id pour obtenir l'ID d'incrément automatique de l'enregistrement nouvellement inséré. Cependant, bien que $ insert_id lui-même ne provoque pas de problèmes d'injection SQL, il est toujours crucial de prévenir l'injection de SQL tout au long du processus d'insertion des données.

Cet article se concentrera sur la façon d'assurer la sécurité de l'opération d'insertion lors de l'utilisation de mysqli :: $ insert_id , afin de protéger l'ensemble du processus des attaques d'injection SQL.


Qu'est-ce que mysqli :: $ insert_id?

MySQLI :: $ INSERT_ID est un attribut de l'objet MySQLI qui renvoie l'ID de clé primaire AutoIncrement généré par l'opération d'insertion la plus récente. Par exemple:

 <?php
$mysqli = new mysqli("gitbox.net", "user", "password", "database");

$sql = "INSERT INTO users (username, email) VALUES ('alice', '[email protected]')";
$mysqli->query($sql);

echo "Juste inséré des donnéesIDOui:" . $mysqli->insert_id;
?>

Dans l'exemple ci-dessus, INSERT_ID renvoie l'ID des données insérées.

Il convient de noter que INSERT_ID est une valeur numérique générée par la base de données et est sûre et n'a pas le risque d'injection SQL. Ce que vous devez vraiment être gardé, c'est que les données de l'utilisateur transmises pendant l'insertion.


La cause profonde du risque d'injection SQL

L'injection SQL est généralement causée par l'entrée de l'utilisateur épissé directement dans des instructions SQL, ce qui entraîne l'exécution du code SQL malveillant. Par exemple:

 <?php
$username = $_GET['username']; // De la saisie de l&#39;utilisateur
$sql = "INSERT INTO users (username) VALUES ('$username')";
$mysqli->query($sql);
?>

Si l'utilisateur entre Alice '); Les utilisateurs de la table de dépression; - , cela entraînera de graves conséquences telles que la suppression de la table de base de données.


Comment empêcher l'injection SQL?

1. Utilisez des instructions préparées

C'est le moyen le plus recommandé de prévenir l'injection de SQL. MySQLI prend en charge les instructions de prétraitement, qui peuvent transmettre séparément les instructions SQL et les données.

Exemple:

 <?php
$mysqli = new mysqli("gitbox.net", "user", "password", "database");

// Préparer les déclarations de prétraitement
$stmt = $mysqli->prepare("INSERT INTO users (username, email) VALUES (?, ?)");

// Lier les paramètres
$username = $_POST['username'];
$email = $_POST['email'];
$stmt->bind_param("ss", $username, $email);

// mettre en œuvre
$stmt->execute();

echo "Nouvellement inséréIDOui:" . $mysqli->insert_id;

$stmt->close();
$mysqli->close();
?>

Ici, ? est un espace réservé et la saisie de l'utilisateur ne sera pas épissée directement dans SQL, et le moteur de la base de données les traitera comme des données ordinaires, évitant complètement l'injection SQL.

2. Vérifiez et filtrez strictement l'entrée des utilisateurs

Bien que les déclarations de prétraitement puissent réduire considérablement les risques, la vérification des formats d'entrée est également une bonne pratique de sécurité. Par exemple, la restriction des noms d'utilisateur pour uniquement des boîtes aux lettres alphanumériques doivent être conformes au format de boîte aux lettres.

 <?php
if (!preg_match('/^[a-zA-Z0-9_]{3,20}$/', $username)) {
    die("Le format de nom d&#39;utilisateur est incorrect");
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    die("Le format de messagerie est incorrect");
}
?>

3. Évitez d'utiliser des instructions SQL d'épissage dynamique

Essayez de ne pas épicher la saisie de l'utilisateur dans les chaînes d'instruction SQL. Si vous avez besoin de coutures, assurez-vous d'utiliser $ mysqli-> real_escape_string () pour vous échapper, mais cette méthode n'est pas aussi sûre que les instructions de prétraitement.


Résumer

  • mysqli :: $ insert_id est sûr et ne provoque pas d'injection SQL.

  • La clé consiste à éviter l'injection SQL lors de l'insertion de données.

  • L'utilisation de déclarations de prétraitement est une meilleure pratique pour se prémunir contre l'injection SQL.

  • Coopérez avec la vérification des entrées pour assurer davantage la sécurité des données.

De cette façon, tout en utilisant MySQLI :: $ insert_id pour obtenir l'ID d'auto-incitation, il peut également assurer le fonctionnement de la sécurité et de l'insertion sans souci.