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 ?
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 :
Créer une procédure stockée paramétrée :
Générer du SQL dynamique pendant le processus :
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 :
Autres notes :
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!