我有一个.NET应用程序,它使用SqlCommand运行以下语句:
DECLARE @SQL VARCHAR(100)
SELECT @SQL = 'CREATE DATABASE ' + @DB
EXEC(@SQL)
@DB参数来自用户输入,因此很明显应用程序容易受到“X DROP DATABASE Y”之类的攻击。我敢肯定,我必须有一种显而易见的方法......
编辑:使用参数化语句无法工作,因为您无法在CREATE DATABASE中使用参数(CREATE DATABASE @DB会返回语法错误)。
答案 0 :(得分:5)
首先,您应该永远不会从网络应用中执行此操作。永远。真。我是认真的。除了部署包之外,我需要执行CREATE DATABASE
的唯一时间来自SSMS中的查询分析器。此外,我怀疑任何允许用户输入数据库名称的代码,然后去创建它。
最重要的是,您发布的内容不是“参数化查询”。它是连接SQL,它是SQL注入漏洞的来源。。如果它是参数化查询(或存储过程,但我认为你不能从sproc中做CREATE DATABASE
),那么SQL注入将不是问题。
您可以使用真正的参数化查询(here is a good tutorial on parametrized queries.),或者清理输入,但是如果正确构建命令和参数对象,ADO.NET或其他任何数据库都可以为您可靠地处理此问题。 / p>
答案 1 :(得分:0)
您可能希望specify parameters - 参数化查询几乎消除了SQL注入攻击(只要您不在接收存储过程中连接字符串)。
就像我在评论中所说的那样,我希望有一个特别好的理由可以动态创建数据库/表,其中创建行似乎适用于大多数其他人。
答案 2 :(得分:0)
使用白名单方法:只允许使用字母。