Maison >base de données >tutoriel mysql >Comment paramétrer en toute sécurité des requêtes SQL dynamiques dans T-SQL ?

Comment paramétrer en toute sécurité des requêtes SQL dynamiques dans T-SQL ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-02 22:41:41145parcourir

How to Safely Parameterize Dynamic SQL Queries in T-SQL?

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!

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