如何防止 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);
我使用动态 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);