0

SQL Server 2005/2008を使用していますが、EXECステートメントの生成に文字列連結を使用しないストアドプロシージャがありますが、ストアドプロシージャの動的名が使用されます。文字列連結のないストアドプロシージャSQLインジェクションの脆弱性

@stored_procedure_nameと潜在的に@object_nameパラメータは両方とも脆弱だと思います。しかし、私が読んだすべての動的SQLリンクは、文字列の中でSQL文を連結していると仮定しているため、実際にはOKかどうか疑問に思っています。

これを投稿するだけで、テーブルオブジェクトを呼び出すことによってコードを一般化しました。したがって、必ずしも論理的な意味をなすわけではありません。ここで

コードです:

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 

答えて

1

はこれを試してみてください:

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'].['[email protected]_procedure_name+N'] @Object_id OUTPUT' 
      EXEC sp_executesql @sql, N'@object_id int OUTPUT', @ObjectId [email protected]_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 

しかし

の代わりに、このような複雑な方法を使用して、あなただけのパラメータ化プロシージャを呼び出すことができますか?

関連する問題