【问题标题】:Disable DML queries in SQLCommand C#在 SQLCommand C# 中禁用 DML 查询
【发布时间】:2015-09-18 23:13:05
【问题描述】:

问题

我正在编写一个 GUI 应用程序,它允许用户根据用户在 TextBox 中输入的 SELECT SQL 查询生成 Excel 文件。它将连接到 SQL 服务器,在数据库上运行选择,填充 DataTable 对象并将该数据推送到 Exel 文件。 我开发应用程序的方式容易受到 SQL 注入的攻击,用户可能能够传递任何 DML 查询,例如 DELETE OR UPDATE。

问题

SQLCLient 库中有没有办法阻止用户输入 DML 查询并执行它们?在传递 DELETE 命令时,我可以以某种方式强制 SQLCommand 对象抛出异常吗?

【问题讨论】:

  • 创建一个只有select grants的数据库用户,并使用这个用户进行连接,然后在执行命令时处理数据库SqlException
  • @BhavO 是一个很好的方法,但它也可以让你暴露系统(例如,如果你坚持使用身份验证数据)根据你的需要,你还可以创建视图并只允许用户在该视图中进行选择或使用动态参数查询
  • 当然,有很多方法可以做到这一点,但我认为它需要的变化最少,也取决于其他变量。
  • 感谢 BhavO,但我更感兴趣的是在 C# 代码中防止这种情况。

标签: c# sql-injection sqlcommand dml sqlclient


【解决方案1】:

执行此操作的正确方法是创建一个数据库用户,该用户仅对指定的表或视图进行选择授权,如 BhavO 和 cmets 中的 jean 所述。

为什么这是限制 T-SQL 命令的正确方法?

  1. 在客户端执行此操作要复杂得多。 Microsoft 提供了一个 T-SQL 解析器库,但您真的想花时间编写和测试树访问者代码确保您只有查询某些特定表的 SELECT 命令?此外,现在您还必须担心使此解析器库组件与 SQL Server 版本保持同步,这些版本可能具有旧解析器库无法理解的新 SELECT 查询语法,并导致您的应用程序出错。为什么不将 T-SQL 解析委托给系统中已经设计用于执行此操作的组件,即 SQL Server?
  2. 在客户端执行此操作并不能提供实际的安全性。 服务器的安全性需要由服务器实现,而不是由其客户端代码实现。客户端代码在用户的机器上运行,因此用户可以完全控制正在执行的内容。这意味着恶意用户可能 (1) 反编译并编辑掉“DML 禁用”检查组件,然后运行编辑后的二进制文件,从而跳过检查,或者更实际地 (2) 使用网络检查工具来确定您的客户端应用程序是如何运行的连接到服务(即连接字符串),然后直接使用 SSMS 或 SQLCMD 或其他任何东西中的连接字符串连接并拥有您的服务器。因此,所有复杂的解析逻辑并没有真正减缓攻击者的速度。

这些原因(以及其他原因)是 SQL Server 中首先存在 GRANT、DENY 等的原因。它们是在堆栈中正确位置实施的好(成熟、经过充分测试、易于使用)工具。

【讨论】:

    【解决方案2】:

    创建一个只有select grants的数据库用户,并使用这个用户进行连接,然后在执行命令时处理数据库SqlException。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多