在SQLCommand C#中禁用DML查询

时间:2015-07-01 16:55:18

标签: c# sql-injection sqlcommand dml sqlclient

问题

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

问题

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

2 个答案:

答案 0 :(得分:3)

正确的方法是创建一个数据库用户,只对指定的表或视图进行选择授权,如BhavO和评论中的jean所述。

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

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

答案 1 :(得分:0)

创建仅包含select grants的数据库用户,并使用此用户进行连接,然后在执行命令时处理数据库SqlException。