Как обезопасить динамическую хранимую процедуру SQL? - PullRequest
2 голосов
/ 12 января 2011

У меня есть хранимая процедура, которая принимает имя таблицы в качестве параметра и использует динамический sql для выполнения выбора. Я пытался передать @TableName в качестве параметра и использовать sp_executesql, но это привело к ошибке. Я решил пойти с прямым динамическим SQL без использования sp_executesql.

Что еще я должен сделать, чтобы защитить параметр @TableName, чтобы избежать атак SQL-инъекций?

Хранимая процедура ниже:

CREATE PROCEDURE dbo.SP_GetRecords  
    (   
    @TableName VARCHAR(128) = NULL
    )   
AS
BEGIN   

    /* Secure the @TableName Parameter */          
    SET @TableName = REPLACE(@TableName, ' ','')    
    SET @TableName = REPLACE(@TableName, ';','')    
    SET @TableName = REPLACE(@TableName, '''','')

    DECLARE @query NVARCHAR(MAX)    

    /* Validation */    
    IF @TableName IS NULL
    BEGIN       
        RETURN -1
    END 

    SET @query = 'SELECT * FROM ' + @TableName
    EXEC(@query)        
END

Ошибка при использовании sp_executesql вместо:

SET @query = 'SELECT * FROM @TableName' 
EXEC sp_executesql @query, N'@TableName VARCHAR(128)', @TableName

ОШИБКА: необходимо объявить переменную таблицы "@TableName".

Ответы [ 2 ]

3 голосов
/ 12 января 2011
2 голосов
/ 12 января 2011

вы, конечно, можете посмотреть на таблицу sysobjects и убедиться, что она существует

Select id from sysobjects where xType = 'U' and [name] = @TableName

Далее (более полный пример):

DECLARE @TableName nVarChar(255)
DECLARE @Query nVarChar(512)

SET @TableName = 'YourTable'
SET @Query = 'Select * from ' + @TableName

-- Check if @TableName is valid
IF NOT (Select id from sysobjects where xType = 'U' and [name] = @TableName) IS NULL
     exec(@Query)
...