如何在ADO.NET中安全地创建查询,其中选择的表更改?

时间:2010-11-22 13:53:32

标签: c# sql ado.net sql-injection database-security

在ADO.NET中,您可以向命令对象添加参数,以便将用户输入安全地添加到SQL查询中。 SQL查询常见的其他谓词的等价物是什么?

我正在编写一个程序,它本质上是一个非常有限的O-R映射器和SQL生成器(它主要关注具有元信息的数据库和符合该元数据的其他数据库)。因此,我需要能够调用以下内容:

string sql = "select " + USER_SELECTED_COLUMNS + 
            " from " + USER_SELECTED_TABLE + 
            " where " + USER_CRITERIA;

其中一些(如criteria)字面上由受信任的用户(我公司的其他开发人员)输入我的程序,而其他数据由不受信任的用户(客户)通过他们的搜索输入我的程序,等

我想让这个程序安全,我知道上面的内容不是。目前我已将USER_SELECTED_COLUMNS替换为命令参数,但我无法找到CRITERIA和TABLE的等效项。 (或按订单列)。是否有任何类似于SqlParameter的ADO.NET功能可以用于非选择谓词?

3 个答案:

答案 0 :(得分:5)

我不认为我可以告诉你如何在1个响应中避免SQL注入,但是,我可以给你的主要指针是:

使用WHITELISTS,而不是BLACKLISTS。

也就是说,在清理USER_SELECTED_TABLE的用户输入时,可能的输入应该只是可能的表。同样,USER_SELECTED_COLUMNS的输入应限于USER_SELECTED_TABLE的可能列。

答案 1 :(得分:2)

当您构建允许用户选择表的屏幕时,列不使用实际名称。您如何拥有UserID但显示UserName的方式。使用object_id和column_id(如表单sys.tables.object_id和sys.columns.object_id + column_id)。将它们添加到您的过程中,仅使用连接到系统视图的数字ID构建SQL:

sys.tables (Transact-SQL)
sys.columns (Transact-SQL)

您可以连接字符串表和列名,但它们将来自系统视图,而不是来自用户输入。

答案 2 :(得分:1)

通过Microsoft Web Protection Library运行您在上面指出的所有变量。它将提供SQL注入和XSS攻击的安全性。下载中有一些示例向您展示如何在代码隐藏中使用它。