私は、テーブルの名前をパラメータとしてとり、動的SQLを使用して選択を実行するストアドプロシージャを持っています。 @TableNameをパラメータとして渡してsp_executesqlを使用しようとしましたが、エラーが発生しました。私は、sp_executesqlを使用せずに直接動的SQLを使用することに決めました。動的SQLストアドプロシージャを保護する方法は?
SQLインジェクション攻撃を避けるために@TableNameパラメータを保護するために何かすべきことはありますか?
以下ストアド・プロシージャの代わりにsp_executesqlを使用している場合
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
は、これは失敗しました:
SET @query = 'SELECT * FROM @TableName'
EXEC sp_executesql @query, N'@TableName VARCHAR(128)', @TableName
ERROR: Must declare the table variable "@TableName".
を選択したどちらのソリューション、SQLが許可でデフォルトで実行されることを、あなたはストアドプロシージャ内の動的SQLを実行するときがあることに注意してください格納されたproc *呼び出し元の*。ストアドプロシージャ内の通常のSQLは、デフォルトではストアドproc * owner *の権限で実行されます。 – RoadWarrior