首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL Server 存儲過程動態 SQL 安全規範:參數化 sp_executesql 替代字符串拼接

     編輯:程式設計綜合問答

DBA 禁令原因

字符串拼接 SET @sql = 'SELECT * FROM t WHERE name=''' + @name + '''' 存在 **SQL 注入風險**:若 @name = '' OR 1=1 --,語句變為 WHERE name='' OR 1=1 --',繞過過濾。

安全模式:sp_executesql 參數化

DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM t WHERE name LIKE @p';
DECLARE @params NVARCHAR(MAX) = N'@p NVARCHAR(100)';
EXEC sp_executesql @sql, @params, @p = @name;
  • @sql 中只包含**靜態結構**(關鍵字、列名、運算符),無用戶輸入。
  • 用戶輸入作為**參數**傳遞,引擎嚴格按類型處理,不可注入。
  • 計劃緩存可復用(參數嗅探),性能優於拼接。

動態列名/表名/排序

識別符無法參數化,必須**白名單驗證**後拼接:

IF @orderCol IN ('col1','col2','col3')
    SET @sql += N' ORDER BY ' + QUOTENAME(@orderCol);

結論

**風險在於「未參數化的用戶輸入」**,而非動態 SQL 本身。規範使用 sp_executesql + 白名單,即可滿足 DBA 合規要求。|

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved