我有一个表,其中有一列表示我们想要创建的表的名称。另一个表有一个外键关系,该表有一列表示所需表的列名(假定所有数据类型为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;--
仍将被视为对象名称。