我想使用 T-SQL 创建一个存储过程,该过程基于不易受到 SQL 注入影响的外部数据动态创建表



我有一个表,其中有一列表示我们想要创建的表的名称。另一个表有一个外键关系,该表有一列表示所需表的列名(假定所有数据类型为nvarchar)。我使用一个存储过程来创建这个表。基本上,我正在做的是从我的表中获取所有相关数据,然后构建一个SQL字符串来生成表,最后使用EXEC sp_executesql @CreateTableSQL .

@CreateTableSQL是通过这样的字符串连接生成的:

SET @CreateTableSQL = 'CREATE TABLE ' + @TableName + ' (' + @ColumnString + ')';

这使我容易受到SQL注入。如果有人使用@TableName值:

C (t int); DROP TABLE MyTable;--

,这将删除MyTable(不希望)。

有人能帮我建立这个SQL,让它不受攻击的注入?非常感谢你的帮助。谢谢!

您可以使用QUOTENAME()函数,它将在变量(表和列名)周围强制使用方括号[],并且传递给这些变量的任何值将仅被视为对象名称。

比如......

SET @CreateTableSQL = 'CREATE TABLE ' + QUOTENAME(@TableName) 
                        + ' (' + QUOTENAME(@ColumnString) + ')';

现在,即使有人将值C (t int); DROP TABLE MyTable;--传递给这些变量中的任何一个,整个值C (t int); DROP TABLE MyTable;--仍将被视为对象名称。

最新更新