C# 将用户定义的T-SQL查询限制为仅选择类型

C# 将用户定义的T-SQL查询限制为仅选择类型,c#,sql,sql-server,C#,Sql,Sql Server,我正在开发一个应用程序,它为用户定义SQL查询并在数据库上运行它提供了一种方法。查询的唯一目的是创建用于生成报告的数据集。由于这是一个共享数据库(意味着有大量帐户和每个帐户表),安全性非常重要 我正在寻找验证提供的查询是否仅为SELECT类型的最佳方法—这意味着用户无法运行DELETE、UPDATE等。。当然,验证必须是服务器端的。这个项目是用C语言写的 第一个检查是验证查询是否以SELECT开头,但由于存在子查询,这还不够。我想验证查询字符串(C#)是否包含一些保留字,如:EXEC、DELET

我正在开发一个应用程序,它为用户定义SQL查询并在数据库上运行它提供了一种方法。查询的唯一目的是创建用于生成报告的数据集。由于这是一个共享数据库(意味着有大量帐户和每个帐户表),安全性非常重要

我正在寻找验证提供的查询是否仅为SELECT类型的最佳方法—这意味着用户无法运行DELETE、UPDATE等。。当然,验证必须是服务器端的。这个项目是用C语言写的

第一个检查是验证查询是否以SELECT开头,但由于存在子查询,这还不够。我想验证查询字符串(C#)是否包含一些保留字,如:EXEC、DELETE、UPDATE、INSERT

是否有任何方法“破解”此验证(使用或其他CHAR)?哪些保留字必须被阻止?还有其他想法吗


非常感谢您抽出时间

您能否为用户提供一个受限制的GUI,供他们指向并单击?这样,通过构造,查询是正确的

下一个想法是创建一个只有正确权限的特殊用户。根据文档,这应该是100%可靠的(如果不是,就不可能保护服务器)。但我并不完全相信这一点,因为SQL Server或您的安全实现中可能存在漏洞。你自己决定这对你来说是否足够


或者,使用SMO解析查询并验证它。确保它符合白名单格式(例如,只有一个
SELECT
,没有函数调用,没有
EXEC
,…)。这很难。

如果安全性非常重要,请不要这样做。考虑一种不同的方法!是否允许使用用户定义的函数?您能否通过限制访问(即仅授予用户应能看到的数据的读取权限)来实现所需的安全级别?@Kaf没有不同的方法来实现该要求(至少我没有看到任何方法)@HABO没有用户定义的功能,只需选择创建数据集-用户具有完全的数据访问权限,因为他可以执行大量已经预定义的查询您可以强制查询在不同的安全上下文中执行吗?请参阅。我们以前使用过点击,但它太有限了-用户必须能够构建复杂的查询。我不认为创建特殊的用户类型是一种选择,因为同一个用户还可以运行大量其他查询(软件定义的)。白名单查询似乎是一种方式,但正如您所说的,很难考虑所有情况。非常感谢您的帮助!您不能将受限用户仅用于该报告查询吗?只需更改该查询的连接字符串。在我看来,这是允许自由形式查询的唯一实用方法。您甚至可以使用资源调控器来限制资源使用并使查询安全。让查询在快照隔离下运行,以确保并发安全(无阻塞、无死锁)。设置一个较低的命令超时。