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 的问题。这里的难题是确保合法用户不会意外删除错误的数据库,更糟糕的是,坏人不会故意删除错误的数据库。
以下代码被突出显示为 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 的问题。这里的难题是确保合法用户不会意外删除错误的数据库,更糟糕的是,坏人不会故意删除错误的数据库。