有没有办法以编程方式从SQL Server上的CREATE / ALTER DATABASE等C#语句调用而不会产生安全问题?

时间:2011-06-29 15:41:59

标签: c# sql-injection

我有一个.NET应用程序,它使用SqlCommand运行以下语句:

DECLARE @SQL VARCHAR(100)
SELECT @SQL = 'CREATE DATABASE ' + @DB
EXEC(@SQL)

@DB参数来自用户输入,因此很明显应用程序容易受到“X DROP DATABASE Y”之类的攻击。我敢肯定,我必须有一种显而易见的方法......

编辑:使用参数化语句无法工作,因为您无法在CREATE DATABASE中使用参数(CREATE DATABASE @DB会返回语法错误)。

3 个答案:

答案 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)

使用白名单方法:只允许使用字母。