3

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

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

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

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

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

4

3 回答 3

5

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

使用白名单,而不是黑名单。

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

于 2010-11-22T14:05:03.410 回答
2

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

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

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

于 2010-11-22T15:25:46.797 回答
1

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

于 2010-11-22T15:35:38.710 回答