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

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

Susan Sarandon
發布: 2025-01-02 22:41:41
原創
184 人瀏覽過

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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板