Sql server 通过“防止SQL注入”;“名称”;使用存储过程

Sql server 通过“防止SQL注入”;“名称”;使用存储过程,sql-server,tsql,stored-procedures,exec,sql-injection,Sql Server,Tsql,Stored Procedures,Exec,Sql Injection,我正在尝试做一些代码“sql注入证明”。有人建议我使用QUOTENAME 这项工作: select 'abc[]def' 并且它给出了类似的结果 select QUOTENAME('abc[]def') 然而,当以下各项起作用时: exec sp_spaceused 'STMALOGqueue' 这并不是: exec sp_spaceused QUOTENAME('STMALOGqueue') 我遇到了一个恼人的错误: Incorrect syntax near 'STMALOGqueu

我正在尝试做一些代码“sql注入证明”。有人建议我使用
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
将相关表名插入该字符串,然后执行它。当前它不起作用

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

declare @test as varchar(100)

set @test = QUOTENAME('STMALOGqueue')

exec sp_spaceused @test
它可以工作。

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

declare @test as varchar(100)

set @test = QUOTENAME('STMALOGqueue')

exec sp_spaceused @test

它是有效的。

请注意,如果您可以将c代码更改为使用参数而不是字符串连接,这将是防止SQL注入的最佳保护。请注意,如果您可以将c代码更改为使用参数而不是字符串连接,这将是防止SQL注入的最佳保护。