如何防止动态sql中的SQL注入批量插入?

时间:2017-08-23 13:35:39

标签: sql sql-server sql-injection bulkinsert bulk

我使用动态SQL进行带参数(Bulk insert using stored procedure)的批量插入。

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

但是......如何避免SQL注入?

2 个答案:

答案 0 :(得分:1)

一种方法是检索文件名,而不是传递给它......比如

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

然后,在#FileNames中将是该目录中的所有文件(当然isfile = 1)。然后,您只需从临时表中查询文件名即可。

答案 1 :(得分:1)

您可以使用QUOTENAME用单引号括起文件名:

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