Maison >base de données >tutoriel mysql >Comment les requêtes paramétrées avec des points d'interrogation empêchent-elles les attaques par injection SQL ?

Comment les requêtes paramétrées avec des points d'interrogation empêchent-elles les attaques par injection SQL ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-09 21:21:43498parcourir

How Do Parameterized Queries with Question Marks Prevent SQL Injection Attacks?

Prévenir l'injection SQL avec des requêtes paramétrées : l'approche du point d'interrogation

Les requêtes paramétrées, indiquées par le point d'interrogation (?) en SQL, constituent une défense cruciale contre les vulnérabilités d'injection SQL. Ces requêtes sont essentielles lors de la construction et de l'exécution dynamique d'instructions SQL au sein d'un programme.

Le principal avantage des requêtes paramétrées par rapport aux requêtes construites manuellement réside dans une sécurité renforcée. La bibliothèque de base de données gère l'insertion de paramètres, appliquant automatiquement les mécanismes d'échappement nécessaires pour empêcher l'injection de code malveillant. Considérez cet exemple vulnérable :

<code class="language-sql">string s = getStudentName();
cmd.CommandText = "SELECT * FROM students WHERE (name = '" + s + "')";
cmd.Execute();</code>

Si un utilisateur saisit : Robert'); DROP TABLE students; --

La requête résultante devient susceptible d'être attaquée.

La solution consiste à utiliser des requêtes paramétrées :

<code class="language-sql">s = getStudentName();
cmd.CommandText = "SELECT * FROM students WHERE name = ?";
cmd.Parameters.Add(s);
cmd.Execute();</code>

La bibliothèque nettoie désormais l'entrée, rendant le code malveillant inoffensif : la requête devient effectivement "SELECT * FROM students WHERE name = 'Robert''); DROP TABLE students; --'" — le code injecté est traité comme du texte littéral.

Bien que le point d'interrogation soit un espace réservé largement utilisé, d'autres systèmes de bases de données, tels que MS SQL Server, utilisent des paramètres nommés (par exemple, @varname) pour une meilleure lisibilité :

<code class="language-sql">cmd.Text = "SELECT thingA FROM tableA WHERE thingB = @varname";
cmd.Parameters.AddWithValue("@varname", 7);
result = cmd.Execute();</code>

Cette approche offre les mêmes avantages en matière de sécurité avec une identification plus claire des paramètres.

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!

Déclaration:
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