C# 执行用户创建的SQL查询

C# 执行用户创建的SQL查询,c#,sql,postgresql,C#,Sql,Postgresql,我需要知道是否有一种安全的方法来运行直接来自用户的SQL查询。我们有一个管理工具,管理员可以通过每小时对数据库运行一次SQL查询来创建关键性能指标。问题是这个过程很容易受到用户错误或恶意用户(例如,用户可以很容易地在此查询中从表中删除数据)所发生的错误的影响。我想知道是否有一种安全的方法来执行这些语句,或者事先知道它们将要做什么,这样,如果它们在执行select之外的任何操作,我们就可以阻止它 一个建议是在事务中运行SQL,然后每次都回滚事务。这是一个不错的解决方案吗?还有一些建议 1.在查询中

我需要知道是否有一种安全的方法来运行直接来自用户的SQL查询。我们有一个管理工具,管理员可以通过每小时对数据库运行一次SQL查询来创建关键性能指标。问题是这个过程很容易受到用户错误或恶意用户(例如,用户可以很容易地在此查询中从表中删除数据)所发生的错误的影响。我想知道是否有一种安全的方法来执行这些语句,或者事先知道它们将要做什么,这样,如果它们在执行select之外的任何操作,我们就可以阻止它

一个建议是在事务中运行SQL,然后每次都回滚事务。这是一个不错的解决方案吗?

还有一些建议

1.在查询中搜索DDL命令,如果存在,则拒绝查询
2.如果可能,尝试通过仅授予select来限制权限
3.记录查询和给出查询的用户,因此这将有助于法医分析

更多建议

1.在查询中搜索DDL命令,如果存在,则拒绝查询
2.如果可能,尝试通过仅授予select来限制权限

3.记录查询和给出查询的用户,因此这对法医分析很有帮助

听起来您最好的选择可能是允许具有有限权限的用户(即只读用户)运行查询。与此答案类似:

听起来您的最佳选择可能是允许具有有限权限的用户(即只读用户)运行查询。类似于这个答案的东西:

一些方法

找到一个BI工具,让他们能够设计自己的报告。构建一个多维数据集来支持它,让em去发疯(BI工具将防止更有害的查询,并确保它根据DB的设置来组装查询)

您可以将他们的查询保存为字符串,并执行一些子字符串函数来查找关键字,如drop、delete、update或任何您认为是恶意的内容。这似乎是一个艰苦的工作方法,因为字符串搜索从来没有那么有趣

最后…权限起作用了,只需将它们设置为只读。我有一种奇怪的感觉,从你的措辞来看,这是不可能的

作为最后一条评论…尽管删除和更新可能很危险,但您也必须对设计糟糕的select语句保持警惕。从tbl1、tbl2、tbl3、tbl4、tbl5等中选择*。。。可能会锁定您的数据库并消耗它所拥有的所有资源。

一些方法

找到一个BI工具,让他们能够设计自己的报告。构建一个多维数据集来支持它,让em去发疯(BI工具将防止更有害的查询,并确保它根据DB的设置来组装查询)

您可以将他们的查询保存为字符串,并执行一些子字符串函数来查找关键字,如drop、delete、update或任何您认为是恶意的内容。这似乎是一个艰苦的工作方法,因为字符串搜索从来没有那么有趣

最后…权限起作用了,只需将它们设置为只读。我有一种奇怪的感觉,从你的措辞来看,这是不可能的


作为最后一条评论…尽管删除和更新可能很危险,但您也必须对设计糟糕的select语句保持警惕。从tbl1、tbl2、tbl3、tbl4、tbl5等中选择*。。。可以锁定您的数据库并使用它拥有的所有资源。

我不知道有没有一种完全安全的方法可以做到这一点,也许您可以授予用户执行每个命令的权限,(比如说,用户可以从特定表中插入和选择,仅此而已),这取决于他们是用户还是管理员,我不知道postgresql是否支持这样的功能。另一种方法是创建一个服务器应用程序,接收来自用户的SQL查询,对其进行分析,如果用户同意则执行,并将查询转发给用户。运行一个存储过程:我不知道有一种完全安全的方法可以做到这一点,也许你可以给用户执行每个命令的权限,(比如说用户可以从特定的表中插入和选择,就是这样),这取决于他们是用户还是管理员,我不知道postgresql是否支持类似的功能。另一种方法是创建一个服务器应用程序,接收用户的SQL查询,分析它们,如果它们合适则执行,并将查询转发给用户。运行存储过程: