没有字符串连接SQL注入漏洞的存储过程

没有字符串连接SQL注入漏洞的存储过程,sql,sql-server-2008,sql-server-2005,stored-procedures,sql-injection,Sql,Sql Server 2008,Sql Server 2005,Stored Procedures,Sql Injection,我使用的是SQLServer2005/2008,我有一个存储过程,它不使用字符串连接来生成EXEC语句,但它使用了存储过程的动态名称 我认为@storage\u procedure\u name和@object\u name参数都有漏洞。但是,我读到的所有动态SQL链接都假设您将SQL语句连接到一个字符串中,所以我想知道它是否真的可以 注意,就为了发布这篇文章,我通过调用表对象使代码变得通用——因此它可能不一定有逻辑意义 代码如下: CREATE PROCEDURE [dbo].[my_dodg

我使用的是SQLServer2005/2008,我有一个存储过程,它不使用字符串连接来生成EXEC语句,但它使用了存储过程的动态名称

我认为@storage\u procedure\u name和@object\u name参数都有漏洞。但是,我读到的所有动态SQL链接都假设您将SQL语句连接到一个字符串中,所以我想知道它是否真的可以

注意,就为了发布这篇文章,我通过调用表对象使代码变得通用——因此它可能不一定有逻辑意义

代码如下:

CREATE PROCEDURE [dbo].[my_dodgy_sp] 
    @object_name varchar(50) = 'All'
AS
BEGIN
    DECLARE @stored_procedure_name varchar(100);

    DECLARE object_cursor CURSOR FOR
        SELECT stored_procedure_name
        FROM [dbo].[objects]
        WHERE [stored_procedure_name] <> ''
        AND ([name] = @object_name)

    OPEN object_cursor

    FETCH NEXT FROM object_cursor 
        INTO @stored_procedure_name

    WHILE @@FETCH_STATUS = 0
       BEGIN

            EXEC @stored_procedure_name @object_id OUTPUT;

            FETCH NEXT FROM object_cursor
                INTO @stored_procedure_name
       END

    CLOSE object_cursor;
    DEALLOCATE object_cursor;
END
创建过程[dbo]。[my_dodgy_sp]
@对象名称varchar(50)=“全部”
作为
开始
声明@storage_procedure_name varchar(100);
声明对象\u光标
选择存储过程名称
来自[dbo]。[objects]
其中[存储过程名称]“”
和([name]=@object\u name)
打开对象光标
从对象\游标获取下一个
进入@storage\u procedure\u name
而@@FETCH\u STATUS=0
开始
EXEC@storage\u procedure\u name@object\u id输出;
从对象\游标获取下一个
进入@storage\u procedure\u name
结束
关闭对象\光标;
释放对象\光标;
结束
试试这个:

CREATE PROCEDURE [dbo].[my_dodgy_sp] 
    @object_name varchar(50) = 'All'
AS
BEGIN
    DECLARE @stored_procedure_name sysname, @oID INT, @sql NVARCHAR(MAX), @object_id int;

    DECLARE object_cursor CURSOR FOR
        SELECT object_id, name
        FROM sys.procedures
        WHERE [name] = @object_name

    OPEN object_cursor

    FETCH NEXT FROM object_cursor 
        INTO @oID, @stored_procedure_name

    WHILE @@FETCH_STATUS = 0
       BEGIN
            SET @sql = N'EXEC ['+OBJECT_SCHEMA_NAME(@oid)+N'].['+@stored_procedure_name+N'] @Object_id OUTPUT'
            EXEC sp_executesql @sql, N'@object_id int OUTPUT', @ObjectId =@object_id OUTPUT

            PRINT @object_id -- we need to do smth with it?

            FETCH NEXT FROM object_cursor
                INTO @oID, @stored_procedure_name
       END

    CLOSE object_cursor;
    DEALLOCATE object_cursor;
END
但是

与其使用如此复杂的方法,不如直接调用参数化过程