Paramétrage des requêtes SQL dynamiques dans T-SQL
Dans les requêtes SQL dynamiques, les paramètres sont cruciaux pour prévenir les attaques par injection SQL et garantir la sécurité des types. Lorsque vous travaillez avec des paramètres dans le SQL dynamique T-SQL, il est important de les transmettre correctement à la procédure stockée sp_executesql.
Problème :
Considérez la requête dynamique suivante qui attend un paramètre UNIQUEIDENTIFIER pour la clause WHERE :
CREATE PROCEDURE [dbo].[sp_Test1] /* 'b0da56dc-fc73-4c0e-85f7-541e3e8f249d' */ ( @p_CreatedBy UNIQUEIDENTIFIER ) AS DECLARE @sql NVARCHAR(4000) SET @sql =' DECLARE @p_CreatedBY UNIQUEIDENTIFIER SELECT DateTime, Subject, CreatedBy FROM ( SELECT DateTime, Subject, CreatedBy, ROW_NUMBER() OVER(ORDER BY DateTime ) AS Indexing FROM ComposeMail WHERE CreatedBy = @p_CreatedBy /* <--- the problem is in this condition */ ) AS NewDataTable ' EXEC sp_executesql @sql
Lorsque cette requête est exécutée sans passer le paramètre, non le résultat est renvoyé.
Solution :
Pour résoudre ce problème, les paramètres doivent être transmis à sp_executesql. Modifiez la clause WHERE comme suit :
WHERE CreatedBy = @p
Et transmettez le paramètre en utilisant le nom du paramètre @p :
EXECUTE sp_executesql @sql, N'@p UNIQUEIDENTIFIER', @p = @p_CreatedBY
Cela garantit que la condition de la clause WHERE utilise la valeur paramétrée de l'appelant , empêchant l'injection SQL et garantissant la sécurité des types.
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!