Maison >base de données >SQL >Comment utiliser les requêtes paramétrées dans SQL pour empêcher l'injection SQL?
Les requêtes paramétrées, également appelées instructions préparées, sont un moyen efficace de prévenir les attaques d'injection SQL. Voici comment vous pouvez les utiliser:
Préparez l'instruction : Au lieu d'incorporer directement la saisie de l'utilisateur dans la commande SQL, vous préparez une instruction avec des espaces réservés aux paramètres. Par exemple, dans une requête SQL pour sélectionner un utilisateur par son nom d'utilisateur, vous utiliseriez un espace réservé ( ?
) Au lieu d'insérer directement le nom d'utilisateur:
<code class="sql">SELECT * FROM users WHERE username = ?</code>
Bind Paramètres : Après la préparation de l'instruction, liez les valeurs réelles des paramètres aux espaces réservés. Cette étape est effectuée séparément de l'instruction SQL elle-même, garantissant que l'entrée est traitée comme des données, et non dans le cadre de la commande SQL.
Par exemple, dans un langage de programmation comme Java avec JDBC, vous pourriez faire:
<code class="java">PreparedStatement pstmt = connection.prepareStatement("SELECT * FROM users WHERE username = ?"); pstmt.setString(1, userInput); // Binding the user's input to the placeholder ResultSet resultSet = pstmt.executeQuery();</code>
En utilisant des requêtes paramétrées, la base de données peut distinguer le code et les données, réduisant considérablement le risque d'injection SQL car l'entrée de l'utilisateur n'est jamais interprétée comme faisant partie de la commande SQL.
La mise en œuvre des requêtes paramétrées nécessite efficacement de comprendre certaines nuances dans différentes bases de données SQL:
MySQL : Utilisez des instructions PREPARE
et EXECUTE
des requêtes paramétrées fournies par le pilote de base de données du langage de programmation, comme PDO
dans PHP ou mysql-connector-python
dans Python.
<code class="sql">PREPARE stmt FROM 'SELECT * FROM users WHERE username = ?'; SET @username = 'user_input'; EXECUTE stmt USING @username;</code>
PostgreSQL : similaire à MySQL, utilisez les commandes PREPARE
et EXECUTE
ou la prise en charge du pilote de base de données pour les requêtes paramétrées.
<code class="sql">PREPARE stmt(text) AS SELECT * FROM users WHERE username = $1; EXECUTE stmt('user_input');</code>
Microsoft SQL Server : Utilisez sp_executesql
pour les requêtes ad hoc ou utilisez des requêtes paramétrées via le pilote du langage de programmation.
<code class="sql">EXEC sp_executesql N'SELECT * FROM users WHERE username = @username', N'@username nvarchar(50)', @username = 'user_input';</code>
Oracle : Oracle prend en charge les variables de liaison dans PL / SQL, qui peuvent être utilisées de manière similaire aux instructions préparées d'autres bases de données.
<code class="sql">SELECT * FROM users WHERE username = :username</code>
Les meilleures pratiques incluent:
Les requêtes paramétrées sont très efficaces par rapport aux types les plus courants d'attaques d'injection SQL. En veillant à ce que la saisie des utilisateurs soit traitée comme des données plutôt que comme un code exécutable, ils empêchent l'injection de SQL malveillant dans vos requêtes. Cependant, ils ne sont pas infaillibles contre toutes les vulnérabilités potentielles:
Pour maximiser la sécurité, combinez des requêtes paramétrées avec d'autres pratiques de sécurité telles que la validation d'entrée, le codage de sortie et les normes de codage sécurisées.
Le test de l'efficacité des requêtes paramétrées dans votre application SQL est cruciale pour garantir qu'ils se protégent contre l'injection SQL. Voici quelques étapes et méthodes à considérer:
'; DROP TABLE users; --
dans un champ de nom d'utilisateur. Si l'application utilise correctement les requêtes paramétrées, la base de données ne doit pas l'exécuter en tant que commande.Outils de test de sécurité automatisés : utilisez des outils comme OWASP ZAP, SQLMAP ou Burp Suite pour automatiser les tests d'injection SQL. Ces outils peuvent systématiquement tenter divers types d'injections pour voir s'ils peuvent contourner vos requêtes paramétrées.
Exemple SQLMAP :
<code class="bash">sqlmap -u "http://example.com/vulnerable_page.php?user=user_input" --level=5 --risk=3</code>
En combinant ces méthodes de test, vous pouvez vous assurer que votre utilisation des requêtes paramétrées empêche efficacement les attaques d'injection SQL et contribue à la sécurité globale de votre application.
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!