使用存储过程通过“ quotename”防止SQL注入

时间:2018-10-10 03:38:47

标签: sql-server tsql stored-procedures exec sql-injection

我正在尝试编写一些“ sql-injection-proof”代码。建议我使用QUOTENAME

这有效:

select 'abc[]def'

它的结果与

相似
select QUOTENAME('abc[]def')

但是,以下方法可行:

exec sp_spaceused 'STMALOGqueue'

这不是:

exec sp_spaceused QUOTENAME('STMALOGqueue')

我收到一个烦人的错误:

Incorrect syntax near 'STMALOGqueue'

我试图从注入中证明的实际代码在某些C#中进行了硬编码。供参考:

string sp_spaceused = @"
drop table if exists #temp
create table #temp(name nvarchar(100), rows int, reserved nvarchar(100), data nvarchar(100), index_size nvarchar(100), unused nvarchar(100))

insert into #temp
exec sp_spaceused QUOTENAME('{0}')";

我正在使用String.format将相关的表名插入此字符串中,然后执行它。当前不起作用

1 个答案:

答案 0 :(得分:2)

QUOTENAME('STMALOGqueue')的结果存储到变量中,并将其用于存储过程参数:

declare @test as varchar(100)

set @test = QUOTENAME('STMALOGqueue')

exec sp_spaceused @test

有效。