2013年12月3日 星期二

T-SQL EXECUTE防止隱碼攻擊

SQL裡有 sp_executesql,學名叫「系統預存程序」,透過指定參數的方法動態組出 T-SQL 指令,來避免使用SQL 資料隱碼的攻擊。而且sp_executesql具備以參數來指定所要執行的 T-SQL,藉由這個特性,可以讓動態組出的 T-SQL 更加安全。

USE Factory
GO

-- 宣告變數
DECLARE @SQLCommand nvarchar(200)
DECLARE @columnList nvarchar(50)
DECLARE @parmColor varchar(10)

-- 定義變數
SET @columnList = N'CarID 車子編號, Type 類型'
SET @parmColor = 'Black'

-- 動態組出 T-SQL
SET @SQLCommand = 'SELECT ' + @columnList + ' FROM Production.Car WHERE Type = @type'

-- 執行動態組出的 T-SQL
--系統預存程序 sp_executesql 需要傳入 3 個參數
EXECUTE sp_executesql @SQLCommand, N'@type varchar(10)', @type = @parmType


要再加上一個查詢的限制條件,就要多宣告並設定一個新變數 @parmPID,同時在系統預存程序 sp_executesql 也要隨之修改

USE CarsFactory
GO

-- 宣告變數
DECLARE @SQLCommand nvarchar(200)
DECLARE @columnList nvarchar(50)
DECLARE @parmType varchar(10)
DECLARE @parmPID int

-- 定義變數
SET @columnList = N'CarID 產品編號, Type 顏色'
SET @parmType = 'Sports Car'
SET @parmCID = 100

-- 動態組出 T-SQL
SET @SQLCommand = 'SELECT ' + @columnList + ' FROM Production.Product WHERE Type = @type AND CarID < @cID'

-- 執行動態組出的 T-SQL
EXECUTE sp_executesql @SQLCommand, N'@type varchar(10), @cID int', @type = @parmType, @cID = @parmCID

不採用EXECUTE 或 sp_executesql的方式

USE CarsFactory
GO

-- 宣告變數
DECLARE @parmType varchar(10)
DECLARE @parmCID int

-- 定義變數
SET @parmType = 'Sports Car'
SET @parmCID = 100

SELECT CarID 產品編號, Type 顏色
FROM Production.Product WHERE Type = @parmType AND CarID < @parmCID

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

沒有留言:

張貼留言