C# 在SQLC命令中禁用DML查询 问题

C# 在SQLC命令中禁用DML查询 问题,c#,sql-injection,sqlcommand,dml,sqlclient,C#,Sql Injection,Sqlcommand,Dml,Sqlclient,我正在编写一个GUI应用程序,允许用户根据用户在文本框中输入的SELECT SQL查询生成Excel文件。它将连接到SQL server,在数据库上运行select,填充DataTable对象并将该数据推送到Exel文件。 我开发应用程序的方式很容易受到SQL注入的攻击,用户可能能够通过任何DML查询,如删除或更新 问题 在SQLCLient库中是否有一种方法可以防止用户输入DML查询并执行它们?我是否可以强制SQLCommand对象在传递DELETE命令时引发异常?正确的方法是创建一个数据库用

我正在编写一个GUI应用程序,允许用户根据用户在文本框中输入的SELECT SQL查询生成Excel文件。它将连接到SQL server,在数据库上运行select,填充DataTable对象并将该数据推送到Exel文件。 我开发应用程序的方式很容易受到SQL注入的攻击,用户可能能够通过任何DML查询,如删除或更新

问题
在SQLCLient库中是否有一种方法可以防止用户输入DML查询并执行它们?我是否可以强制SQLCommand对象在传递DELETE命令时引发异常?

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

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

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

仅使用select授权创建数据库用户,并将此用户用于连接,然后在执行命令时处理数据库SqlException。

仅使用select授权创建数据库用户,并将此用户用于连接,然后在执行command@BhavO这是一种很好的方法,但如果您坚持使用it身份验证数据,它也可以使您的系统公开。例如,根据您的需要,您还可以创建视图,只允许用户在该视图中选择或使用动态参数查询,有很多方法可以做到这一点,但我认为它所需的最少更改也取决于其他变量。