开发者社区 问答 正文

从SQL注入保护动态SQL

我想就我编写的一段SQL代码向你们咨询。它是在数据库中所有对象上运行的动态脚本,并将每个实例的模式名称从[dbo]更改为数据库名称。该脚本可以正常运行,我想知道是否可以做一些更好的事情来保护它免受SQL Injection的侵害。

BEGIN TRANSACTION

/* Change schema to all objects in database (from dbo)*/

DECLARE @SchemaName SYSNAME = db_name();
DECLARE @SQL NVARCHAR(MAX) = N'IF Not Exists (select 1 from sys.schemas where schema_id = SCHEMA_ID(@NewSchemaName))
        EXEC(''CREATE SCHEMA ''+@NewSchemaName+'''')' + NCHAR(13) + NCHAR(10);

SELECT @SQL = @SQL + N'EXEC(''ALTER SCHEMA ''+@NewSchemaName+'' TRANSFER [' + SysSchemas.Name + '].[' + DbObjects.Name + ']'');' + NCHAR(13) + NCHAR(10)
FROM sys.Objects DbObjects
INNER JOIN sys.Schemas SysSchemas
    ON DbObjects.schema_id = SysSchemas.schema_id
WHERE SysSchemas.Name = 'dbo'
    AND (DbObjects.Type IN ('U', 'P', 'V'))

EXECUTE sp_executesql @sql, N'@NewSchemaName sysname', @NewSchemaName = @SchemaName

ROLLBACK

为了确保这一点,我使用了Thom Andrews的精彩文章: Dynamic SQL的要点

这是我开始的地方:github.com/NathanLifshes

展开
收起
心有灵_夕 2019-12-10 17:33:18 596 分享 版权
0 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址: