2

我正在创建一个允许用户构造复杂 SELECT 语句的应用程序。生成的 SQL 是不可信的,完全是任意的。

我需要一种方法来相对安全地执行不受信任的 SQL。我的计划是创建一个仅对相关架构和表具有 SELECT 权限的数据库用户。不受信任的 SQL 将作为该用户执行。

这有什么可能出错?:)

如果我们假设 postgres 本身没有严重漏洞,那么用户可能会进行大量交叉连接并导致数据库过载。这可以通过会话超时来缓解。

我觉得还有很多事情不会出错,但我很难拿出一份清单。

编辑:

根据到目前为止的评论/答案,我应该注意到在任何给定时间使用此工具的人数将非常接近 0。

4

4 回答 4

3

SELECT 查询不能更改数据库中的任何内容。缺少 dba 权限保证无法更改任何全局设置。因此,过载确实是唯一的问题。

Onerload 可能是复杂查询或太多简单查询的结果。

  • 可以通过设置排除过于复杂statement_timeout的查询postgresql.conf

  • 也可以避免接收大量简单的查询。首先,您可以设置每个用户的并行连接限制(alter userwith CONNECTION LIMIT)。如果你在用户和 postgresql 之间有一些接口程序,你可以额外(1)在每次查询完成后添加一些额外的等待,(2)引入 CAPTCHA 以避免自动 DOS 攻击

补充: PostgreSQL 公共系统函数提供了许多可能的攻击向量。他们可以被称为select pg_advisory_lock(1),每个用户都有权调用他们。因此,您应该限制对它们的访问。好的选择是创建所有“可调用词”的白名单,或者更准确地说,创建可以(在它们之后使用的标识符。并排除所有包含类似调用构造identifier (且标识符不在白名单中的查询。

于 2013-08-30T16:24:04.100 回答
1

除了让用户只选择 SELECT 和撤销函数的权限之外,想到的事情:

  • 只读事务。当一个事务由 启动BEGIN READ ONLYSET TRANSACTION READ ONLY作为它的第一条指令时,它不能写任何东西,独立于用户权限。

  • 在客户端,如果要限制为一个SELECT,最好使用不接受多个查询捆绑为一个的 SQL 提交功能。例如,API 的 swiss-knifePQexec方法libpq确实接受这样的查询,并且构建在它之上的每个驱动程序函数,如 PHP 的pg_query.

  • http://sqlfiddle.com/是一项专门用于运行任意 SQL 语句的服务,这可能被视为一种概念证明,它可以在不被黑客攻击或整天被 DDos 攻击的情况下实现。

于 2013-09-02T14:34:31.497 回答
0

使用精心设计的查询在主服务器上保护自己免受 DoS 攻击的唯一方法(从我的角度来看)是设置 Postgres DB 的只读副本和此副本 DB 上的特殊受限用户。这样主 Postgres 服务器就不会受到副本查询的影响。

当主数据库由于某种原因失败时,您还将获得热备用/连续复制数据库。

于 2013-08-30T18:05:19.017 回答
0

问题在于,我不确定 sql 本身在会话超时后是否仍会继续在后台运行(通过谷歌无论哪种方式都找不到太多证据,而且我没有任何真正的经验)我自己也尝试过)。如果您仅限于选择访问权限,我认为这是可能发生的最坏情况。真正的问题是如果有一百个用户尝试进行复杂的交叉连接会发生什么?会话超时是否删除查询,它会给数据库带来真正的沉重负载(很容易足以完全关闭数据库)

于 2013-08-30T16:01:31.243 回答