2017-08-23 15 views
0

私はパラメータ(Bulk insert using stored procedure)で一括挿入に動的SQLを使用しています。動的SQLの一括挿入のSQLインジェクションを防ぐ方法は?

DECLARE @sql NVARCHAR(4000) = 'BULK INSERT TblValues FROM ''' + @FileName + ''' WITH (FIELDTERMINATOR ='','', ROWTERMINATOR =''\n'')'; 
EXEC(@sql); 

しかし...どのようにSQLインジェクションを避けるには?

+0

はsp_executesqlをhttps://docs.microsoft.com/en-us/sql/relational-databases/system-を見てみましょうストアドプロシージャ/ sp-executedql-transact-sql – Leonidas199x

+0

@ Leonidas199x - sp_executesqlはパラメータで動作し、一括挿入は 'FROM'句のパラメータをサポートしません –

+0

私の悪い、それを認識していませんでした。 – Leonidas199x

答えて

1

あなたは、単一引用符でファイル名を囲むようにQUOTENAMEを使用することができます。

DECLARE @sql NVARCHAR(4000) = 'BULK INSERT TblValues FROM ' + QUOTENAME(@FileName,'''') + ' WITH (FIELDTERMINATOR ='','', ROWTERMINATOR =''\n'')'; 
EXEC (@sql); 
1

一つの方法は、そのディレクトリ(もちろんISFILE = 1)内のすべてのファイルになりますファイル名を取得対#FileNamesで、で...そして、

DECLARE @fileLocation VARCHAR(128) = '\\some\folder\location' 

IF OBJECT_ID('tempdb..#FileNames') IS NOT NULL DROP TABLE #FileNames 
CREATE TABLE #FileNames(
    id int IDENTITY(1,1) 
    ,subdirectory nvarchar(512) 
    ,depth int 
    ,isfile bit) 
INSERT #FileNames(subdirectory,depth,isfile) 
EXEC xp_dirtree @fileLocation, 1, 1 

のようなもの、それを渡すことであろう。次に、一時表からファイル名を照会するだけです。

関連する問題