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这样的输入param输入到存储过程并以这种方式使用它安全吗?
发布于 2020-09-09 15:10:20
这样做是不安全的。
您可以运行这个快速演示程序,查看可能出错的地方。
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发布于 2020-09-09 15:46:02
我想我在其他地方见过这个问题,我可能想要更多的信息。我要再做一次。你的目的是什么?为什么要使用动态SQL?SQL的哪一部分是动态的,哪些部分的输入可以被邪恶的罪犯修改?
没有这样的细节,我们所能做的就是提出一些建议,然后其他人可以通过注入一些东西来反驳这个提议,就像下面我将用Dominique的例子所做的那样(没有批评的意图,也很难精确到如此少的信息)。
因此,请解释为什么使用动态SQL,为什么不只是为存储过程提供两个参数(每个值用于INSERT语句的VALUES子句)。
无论如何,下面是用注入截断表修改的建议答案:
DROP TABLE IF EXISTS SomeVeryImportantData
DROP TABLE IF EXISTS #ThisIsATable
CREATE TABLE SomeVeryImportantData (id int, txt varchar(30));
INSERT INTO SomeVeryImportantData VALUES (1,'some important txt');
DECLARE @param1 int;
DECLARE @param2 varchar(30);
SET @param1=1;
set @param2='one';
DECLARE @TSQL nvarchar(MAX) = N'SELECT @param1, @param2 truncate table SomeVeryImportantData';
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 SomeVeryImportantData;
--Rows removed
SELECT * FROM #ThisIsATable;https://dba.stackexchange.com/questions/275242
复制相似问题