首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场

TSQL注入
EN

Database Administration用户
提问于 2020-09-09 14:50:15
回答 2查看 258关注 0票数 -1
代码语言:javascript
运行
复制
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输入到存储过程并以这种方式使用它安全吗?

EN

回答 2

Database Administration用户

回答已采纳

发布于 2020-09-09 15:10:20

这样做是不安全的。

您可以运行这个快速演示程序,查看可能出错的地方。

代码语言:javascript
运行
复制
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

你可能想做这样的事情:

代码语言:javascript
运行
复制
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
票数 4
EN

Database Administration用户

发布于 2020-09-09 15:46:02

我想我在其他地方见过这个问题,我可能想要更多的信息。我要再做一次。你的目的是什么?为什么要使用动态SQL?SQL的哪一部分是动态的,哪些部分的输入可以被邪恶的罪犯修改?

没有这样的细节,我们所能做的就是提出一些建议,然后其他人可以通过注入一些东西来反驳这个提议,就像下面我将用Dominique的例子所做的那样(没有批评的意图,也很难精确到如此少的信息)。

因此,请解释为什么使用动态SQL,为什么不只是为存储过程提供两个参数(每个值用于INSERT语句的VALUES子句)。

无论如何,下面是用注入截断表修改的建议答案:

代码语言:javascript
运行
复制
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;
票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/275242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档