SQL 避免 SQL 注入攻击的 DDL 代码

SQL DDL code to avoid SQL Injection Attacks

以下代码被突出显示为 SQL 注入攻击的安全漏洞。

StringBuilder sb = new StringBuilder();
sb.Append("DROP DATABASE IF EXISTS " + dbname);

String **sqlCommText** = sb.ToString();

using (SqlCommand command = new SqlCommand(**sqlCommText**, connection))
{

   connection.Open();

即sqlCommText

我知道在 DML sql 上创建准备好的语句,例如插入和更新,但我认为这不适用于 DDL sql - 我无法将 dbname 参数化到 sql .

有什么解决方法的建议吗?

在这里防止 SQL 注入非常简单:查询 SQL 服务器上所有数据库的名称,如下所示:

SELECT name, QUOTENAME(name) as QName 
FROM sys.databases 
WHERE database_id > 4;

然后,在执行剩余的 SQL 代码之前,只需检查 dbname 变量是否在查询返回的名称列表中,如果是,则使用相应的QName 在您的查询中(这可以防止数据库名称中出现奇怪的字符,也可以防止称为 潜在注入 的东西)。

然而,正如我在评论中提到的,停止注入是 easy 的问题。这里的难题是确保合法用户不会意外删除错误的数据库,更糟糕的是,坏人不会故意删除错误的数据库。