如何防止 SQL 注入动态 sql 进行批量插入?

How to prevent SQL injection in dynamic sql for bulk insert?

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

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

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

一种方法是检索文件名而不是将其传入...类似

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)。然后你可以简单地从临时文件中查询文件名 table.

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

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