Maison >base de données >tutoriel mysql >Comment puis-je transmettre en toute sécurité les noms de tables aux procédures stockées pour éviter l'injection SQL ?

Comment puis-je transmettre en toute sécurité les noms de tables aux procédures stockées pour éviter l'injection SQL ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-15 12:18:46901parcourir

How Can I Safely Pass Table Names to Stored Procedures to Avoid SQL Injection?

Passer le nom de la table à la procédure stockée

Dans la programmation de bases de données, il est souvent nécessaire d'écrire des requêtes qui font référence à des tables spécifiques en fonction des entrées de l'utilisateur. Les approches traditionnelles impliquent la construction dynamique d'instructions SQL dans les applications clientes, ce qui soulève des problèmes de sécurité et est généralement considéré comme une mauvaise pratique.

Au lieu de cela, une solution plus propre et plus sûre consiste à transmettre le nom de la table en tant que paramètre à la procédure stockée. Cependant, des défis surviennent lorsque la table cible change en fonction des entrées de l'utilisateur.

Défi :

Dans certains cas, la table cible est sélectionnée en fonction de la saisie de l'utilisateur. Par exemple, si les valeurs d'entrée sont "FOO" et "BAR", la requête pourrait être "SELECT * FROM FOO_BAR". Comment pouvons-nous paramétrer de telles requêtes pour éviter l’injection SQL et utiliser la chaîne transmise pour l’exécution dynamique de SQL ?

Solution :

L'approche recommandée consiste à utiliser une combinaison de procédures stockées paramétrées et de SQL dynamique :

  1. Créer une procédure stockée paramétrée :

    • Créez une procédure stockée qui accepte un paramètre de nom de table.
    • Générez dynamiquement la requête en utilisant le nom de table transmis pendant la procédure.
    • Assurez-vous de valider le nom de la table transmis par rapport à une liste blanche ou utilisez une recherche pour empêcher les entrées malveillantes.
  2. Générer du SQL dynamique pendant le processus :

    • Combinaison d'instructions SQL en utilisant les noms de tables transmis dans des procédures stockées.
    • Utilisez l'instruction EXECUTE SQL pour exécuter du SQL dynamique.

Exemple de procédure stockée :

<code class="language-sql">CREATE PROC spCountAnyTableRows(
    @PassedTableName AS NVARCHAR(255)
) AS
BEGIN
    DECLARE @ActualTableName AS NVARCHAR(255)

    SELECT @ActualTableName = QUOTENAME(TABLE_NAME)
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME = @PassedTableName

    DECLARE @sql AS NVARCHAR(MAX)
    SET @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ';'

    EXEC sp_executesql @sql
END</code>

Avantages :

  • Sécurité : Cette approche empêche les attaques par injection SQL en évitant l'utilisation de chaînes transmises pour l'exécution dynamique de SQL.
  • Clarté : Les requêtes paramétrées aident à garder votre code organisé et facile à maintenir.
  • Efficacité : Les procédures stockées peuvent être mises en cache et réutilisées, améliorant ainsi les performances par rapport au SQL dynamique.

Autres notes :

  • QUOTENAME est utilisé dans l'exemple pour garantir que les caractères spéciaux dans le nom de la table transmis sont correctement échappés.
  • Utilisez INFORMATION_SCHEMA pour une transformation de recherche afin de valider le nom de la table saisi.
  • Si nécessaire, les noms de colonnes peuvent également être transmis dynamiquement à l'aide de paramètres SQL.

Cette sortie révisée conserve la langue d'origine, évite de changer la signification, conserve l'image dans son format et son emplacement d'origine et offre une explication légèrement reformulée et plus concise. L'exemple SQL est légèrement amélioré en utilisant sp_executesql qui est généralement. préféré pour une meilleure sécurité et une meilleure gestion 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