我正在创建一个应用程序,允许用户构造复杂的SELECT语句。生成的SQL不能被信任,而且完全是任意的。
我需要一种相对安全地执行不受信任的SQL的方法。我的计划是创建一个只对相关架构和表具有选择特权的数据库用户。不受信任的SQL将作为该用户执行。
那有什么可能出错呢?)
如果我们假设postgres本身没有关键的漏洞,那么用户可以执行一系列交叉连接并重载数据库。这可以通过会话超时来缓解。
我觉得有很多事情可能会出错,但我很难想出一个清单。
编辑:
根据到目前为止的评论/答案,我应该指出,在任何时候使用这个工具的人数将非常接近于0。
发布于 2013-09-02 14:34:31
除了让用户选择和撤销函数上的特权之外,还想到了一些事情:
BEGIN READ ONLY或SET TRANSACTION READ ONLY作为其第一条指令启动时,它不能编写任何东西,这与用户权限无关。SELECT,最好使用不接受绑定到其中的多个查询的SQL函数。例如,PHP的瑞士刀PQexec方法确实接受这样的查询,构建在其之上的每个驱动程序函数也是如此,比如PHP的PQexec。发布于 2013-08-30 16:24:04
选择查询不能更改数据库中的任何内容。缺乏dba特权可以保证任何全局设置都不能更改。所以,过载确实是唯一的问题。
Onerload可能是复杂查询或太多简单查询的结果。
statement_timeout中设置postgresql.conf来排除过于复杂的查询alter user和CONNECTION LIMIT)。如果您在用户和postgresql之间有一些接口程序,您还可以另外(1)在每次查询完成后增加一些额外的等待,(2)引入CAPTCHA,以避免DOS的自动攻击。添加: PostgreSQL公共系统功能提供了许多可能的攻击向量。它们可以像select pg_advisory_lock(1)一样被调用,每个用户都有调用它们的特权。所以,你应该限制对他们的访问。好的选择是创建所有“可调用单词”的白名单,或者更准确地说,可以在它们之后与(一起使用的标识符。并排除所有包含类似调用的构造identifier (的查询,其标识符不在白名单中。
发布于 2013-08-30 16:01:31
问题在于,在会话超时之后,我不确定sql本身是否还会继续在后台运行(通过google也找不到太多的证据,也没有我自己尝试过的任何实际经验)。如果您只选择访问权限,我认为这是可能发生的最糟糕的情况。真正的问题是,如果有100个用户试图执行复杂的交叉连接,会发生什么?会话超时是否删除查询,它将给数据库带来很大的负担(很容易就足以将数据库完全删除)
https://stackoverflow.com/questions/18537100
复制相似问题