Heim >Datenbank >MySQL-Tutorial >Wie kann ich dynamische SQL-Abfragen in T-SQL sicher parametrisieren?

Wie kann ich dynamische SQL-Abfragen in T-SQL sicher parametrisieren?

Susan Sarandon
Susan SarandonOriginal
2025-01-02 22:41:41145Durchsuche

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

Parametrisierung dynamischer SQL-Abfragen in T-SQL

Bei dynamischen SQL-Abfragen sind Parameter entscheidend, um SQL-Injection-Angriffe zu verhindern und die Typsicherheit zu gewährleisten. Beim Arbeiten mit Parametern in dynamischem T-SQL-SQL ist es wichtig, diese korrekt an die gespeicherte Prozedur sp_executesql zu übergeben.

Problem:

Bedenken Sie die folgende dynamische Abfrage, die erwartet ein UNIQUEIDENTIFIER-Parameter für die WHERE-Klausel:

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

Wenn diese Abfrage ohne Übergabe des Parameters ausgeführt wird, ergibt sich kein Ergebnis wird zurückgegeben.

Lösung:

Um dieses Problem zu beheben, müssen Parameter an sp_executesql übergeben werden. Ändern Sie die WHERE-Klausel wie folgt:

WHERE 
    CreatedBy = @p

Und übergeben Sie den Parameter mit dem @p-Parameternamen:

EXECUTE sp_executesql @sql, N'@p UNIQUEIDENTIFIER', @p = @p_CreatedBY

Dadurch wird sichergestellt, dass die WHERE-Klauselbedingung den parametrisierten Wert vom Aufrufer verwendet , verhindert SQL-Injection und gewährleistet Typsicherheit.

Das obige ist der detaillierte Inhalt vonWie kann ich dynamische SQL-Abfragen in T-SQL sicher parametrisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn