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

Posted

技术标签:

【中文标题】如何在 ADO.NET 中安全地创建从更改中选择的表的查询?【英文标题】:How do I securely create queries in ADO.NET where the tables being selected from change? 【发布时间】:2011-05-13 20:43:15 【问题描述】:

在 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 和 TABLEs 的等效项。 (或按列排序)。是否有任何类似于 SqlParameter 的 ADO.NET 功能可用于非选择谓词?

【问题讨论】:

这是一场 SQL 注入的噩梦,请谨慎行事,并在您的应用上完成一次体面的渗透测试。 是的,我知道。因此问题。另一方面,我们的客户已经使用该系统的 100% 易受注入攻击版本 16 年了。这就是企业与客户关系的美妙之处。但是:因为我将它从 VB6/ADO 迁移到 C#/ADO.NET,所以我认为额外的安全性不会受到伤害。 【参考方案1】:

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

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

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

【讨论】:

所以我认为除了选择的列之外,没有真正的方法来清理参数?【参考方案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)

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于如何在 ADO.NET 中安全地创建从更改中选择的表的查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ADO.NET 源 SSIS 中传递参数

如何从 ADO.NET Entity Framework 中的模型生成表?

使用asp.net mv在ado.net中选择带有where子句的查询

使用 SVN,如何选择性地创建补丁文件?

OOPS 和 ADO.Net

在 ASP.NET C# Web 应用程序中使用 ADO.NET 和 XML