我正在尝试编写一些“ 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
将相关的表名插入此字符串中,然后执行它。当前不起作用
答案 0 :(得分:2)
将QUOTENAME('STMALOGqueue')
的结果存储到变量中,并将其用于存储过程参数:
declare @test as varchar(100)
set @test = QUOTENAME('STMALOGqueue')
exec sp_spaceused @test
有效。