sta*_*tem 5 .net c# postgresql npgsql
鉴于连接字符串中指定的用户具有write/alter/etc.权限,是否有一种可靠的方法来防止在运行用户提供的查询时修改数据(由下面的变量查询中的'query'指定)?
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();
}
Run Code Online (Sandbox Code Playgroud)
上面的代码段有两个安全网 - 在只读事务中运行,最后回滚事务.
但是,用户可以通过添加语句"SET TRANSACTION READ WRITE;"轻松覆盖这两者.和"COMMIT;"
是否有更复杂的方法来确保即席查询不会对数据库进行任何更改?
请注意,我们无法访问数据库本身,因此无法创建任何SP,角色等来帮助解决此问题.在这种情况下我们所拥有的只是用户指定的连接字符串和用户查询.