【发布时间】:2012-01-07 01:12:35
【问题描述】:
这个存储过程被认为是动态 SQL 还是参数化查询?
CREATE PROCEDURE [dbo].[my_dodgy_sp]
@varchar1 varchar(50),
@varchar2 varchar(50)
AS
BEGIN
...
EXEC [dbo].[my_really_special_sp] @varchar1 @varchar2;
END
如果你能告诉我这是否是动态/参数化的,那么额外的带有樱桃的巧克力甜甜圈:
CREATE PROCEDURE [dbo].[my_super_dodgy_sp]
@varchar1 varchar(50),
@varchar2 varchar(50),
@stored_procedure_name sysname
AS
BEGIN
...
EXEC @stored_procedure_name @varchar1 @varchar2;
END
【问题讨论】:
-
为了让超级狡猾的 sp 不那么狡猾,您可以添加一些验证以确保 @spname 是“合法的”。
-
这就是我感到困惑的地方。由于超级狡猾只是使用参数,这可能是一个参数化查询,在这种情况下你不能注入 SQL 代码。所以它一点也不狡猾,你也不需要验证。
-
你不能用
EXEC @sp @param注入代码。您只能提供对不同 SP 的引用。这是微妙的不同。我不太同意 dknaack 的回答,所以我添加了自己的。我希望它有帮助:) -
太棒了 - 这回答了我试图解决的实际问题。但我会离开并尝试我自己的一些 SQL 注入来确认。我添加了对 sys.procedures 的检查(如您的第一条评论),但只是为了防止 SQL 注入!
标签: sql stored-procedures dynamic-sql