sql注入-在SQLCommand C#中禁用DML查询

本文关键字:DML 查询 注入 SQLCommand sql | 更新日期: 2023-09-27 18:00:45

问题

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

问题

SQLCLient库中是否有一种方法可以防止用户输入DML查询并执行它们?当DELETE命令被传递时,我能以某种方式强制SQLCommand对象抛出异常吗?

sql注入-在SQLCommand C#中禁用DML查询

正确的方法是创建一个数据库用户,只向指定的表或视图授予选择权限,如BhavO和jean在注释中所述。

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

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

这些原因是SQL Server中首先存在GRANT、DENY等的原因。它们是很好的(成熟、测试良好、易于使用)工具,在堆栈中的正确位置实现。

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