C# Npgsql-以只读方式运行用户指定的查询

C# Npgsql-以只读方式运行用户指定的查询,c#,.net,postgresql,npgsql,C#,.net,Postgresql,Npgsql,考虑到连接字符串中指定的用户具有写入/更改/等权限,在运行用户提供的查询时(如下面变量查询中的“query”所指定),是否有可靠的方法防止数据修改 上面的代码段有两个安全网——在只读事务中运行,在最后回滚事务 但是,用户可以通过添加语句“SET TRANSACTION READ WRITE;”和“COMMIT;”轻松地覆盖这两个属性 有没有更复杂的方法来确保临时查询不会对数据库进行任何更改 请注意,我们无权访问数据库本身,因此无法创建任何SP、角色等来帮助解决此问题。在这种情况下,我们只有用户指

考虑到连接字符串中指定的用户具有写入/更改/等权限,在运行用户提供的查询时(如下面变量查询中的“query”所指定),是否有可靠的方法防止数据修改

上面的代码段有两个安全网——在只读事务中运行,在最后回滚事务

但是,用户可以通过添加语句“SET TRANSACTION READ WRITE;”和“COMMIT;”轻松地覆盖这两个属性

有没有更复杂的方法来确保临时查询不会对数据库进行任何更改


请注意,我们无权访问数据库本身,因此无法创建任何SP、角色等来帮助解决此问题。在这种情况下,我们只有用户指定的连接字符串和用户查询。

创建一个用户,该用户只能选择一个角色,这样他们就没有启动事务或类似操作的权限。刚刚看到你问题的最后一点。访问您的数据库。以抽象层(如实体框架)的形式构建抽象会更好吗?为什么要求用户直接输入SQL查询?
using (NpgsqlTransaction transaction = conn.BeginTransaction())
{
    using (NpgsqlCommand setReadonlyCommand = new NpgsqlCommand("SET TRANSACTION READ ONLY;", conn, transaction))
    {
        setReadonlyCommand.ExecuteNonQuery();
    }

    using (NpgsqlCommand command = new NpgsqlCommand(query, conn, transaction))
    {
        using (var reader = command.ExecuteReader())
        {
            //... read query results
        }
    }

    transaction.Rollback();
}