Sql-Server
TSQL - Sql 注入
DECLARE @TSQL NVARCHAR(MAX) = N'SELECT 1, ''One'''; CREATE TABLE #ThisIsATable (Id INT, VAL NVARCHAR(10)); INSERT INTO #ThisIsATable EXEC [dbo].[sp_executesql] @TSQL ;
將@TSQL 之類的輸入參數輸入到儲存過程並以這種方式使用它是否安全?
這不是一種安全的方法。
您可以執行此快速展示以查看可能出現的問題
create database demo Go use demo Go Create table SomeVeryImportantData (id int, txt varchar(30)); insert into SomeVeryImportantData values (1,'some txt'); DECLARE @TSQL NVARCHAR(MAX) = N'truncate table SomeVeryImportantData;' CREATE TABLE #ThisIsATable (Id INT, VAL NVARCHAR(10)); INSERT INTO #ThisIsATable EXEC [dbo].[sp_executesql] @TSQL ; select * from SomeVeryImportantData; drop table #ThisIsATable
你可能想做這樣的事情:
declare @param1 int; declare @param2 varchar(30); set @param1=1; set @param2='one'; DECLARE @TSQL NVARCHAR(MAX) = N'SELECT @param1, @param2'; CREATE TABLE #ThisIsATable (Id INT, VAL NVARCHAR(10)); INSERT INTO #ThisIsATable EXEC [dbo].[sp_executesql] @TSQL, N'@param1 int, @param2 varchar(30)', @param1=@param1, @param2=@param2 select * from #ThisIsATable; drop table #ThisIsATable