首頁 >資料庫 >mysql教程 >如何在 T-SQL 中安全地參數化動態 SQL 查詢?

如何在 T-SQL 中安全地參數化動態 SQL 查詢?

Susan Sarandon
Susan Sarandon原創
2025-01-02 22:41:41166瀏覽

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

在T-SQL 中參數化動態SQL 查詢

在動態SQL 查詢中,參數對於防止SQL 注入攻擊並確保類型安全至關重要。在 T-SQL 動態 SQL 中使用參數時,將它們正確傳遞給 sp_executesql 預存程序非常重要。

問題:

考慮以下預期的動態查詢WHERE 子句的UNIQUEIDENTIFIER 參數:

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

當此查詢時不傳遞參數執行此查詢時不傳遞參數執行此查詢時不傳遞參數,不回傳結果。

解決方案:

要解決此問題,必須將參數傳遞給 sp_executesql。修改WHERE 子句如下:

WHERE 
    CreatedBy = @p

並使用@p 參數名稱傳遞參數:

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

這確保WHERE 子句條件使用來自呼叫者的參數化值,防止SQL注入並確保類型安全。

以上是如何在 T-SQL 中安全地參數化動態 SQL 查詢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn