Maison >base de données >tutoriel mysql >Comment les instructions préparées empêchent-elles l'injection SQL ?

Comment les instructions préparées empêchent-elles l'injection SQL ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-20 22:57:08398parcourir

How Do Prepared Statements Prevent SQL Injection?

Déclarations préparées : une défense robuste contre l'injection SQL (partie 2)

Les instructions préparées offrent une approche proactive de la prévention des injections SQL. Ils y parviennent en séparant les données fournies par l'utilisateur de la structure des requêtes SQL. Au lieu d'intégrer les entrées de l'utilisateur directement dans la chaîne de requête, les instructions préparées utilisent des paramètres, généralement représentés par des points d'interrogation (?), comme espaces réservés.

Le moteur de base de données analyse et compile l'instruction préparée avant que les données utilisateur soient ajoutées. Cette étape cruciale garantit que les entrées de l'utilisateur sont traitées uniquement comme des données, empêchant ainsi leur interprétation comme du code SQL exécutable. Cela contraste fortement avec la méthode vulnérable consistant à concaténer directement les entrées de l'utilisateur dans la chaîne SQL.

Exemple illustratif : envisagez d'insérer des données utilisateur dans une base de données.

Concaténation de chaînes vulnérables :

<code class="language-java">PreparedStatement stmt = conn.createStatement("INSERT INTO students VALUES('" + user + "')");
stmt.execute();</code>

Relevé préparé sécurisé :

<code class="language-java">PreparedStatement stmt = conn.prepareStatement("INSERT INTO student VALUES(?)");
stmt.setString(1, user);
stmt.execute();</code>

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

La méthode de concaténation de chaînes donne :

<code class="language-sql">INSERT INTO students VALUES('Robert'); DROP TABLE students; --')</code>

Cela exécute la commande DROP TABLE malveillante.

Cependant, avec l'instruction préparée, la base de données exécute :

<code class="language-sql">INSERT INTO student VALUES('Robert');</code>

L'entrée malveillante est traitée comme des données littérales, neutralisant la menace d'injection SQL. Les instructions préparées isolent efficacement la logique de la requête des entrées utilisateur potentiellement dangereuses, garantissant ainsi l'intégrité de la commande SQL.

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