首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只使用SELECT用户执行不受信任的SQL

只使用SELECT用户执行不受信任的SQL
EN

Stack Overflow用户
提问于 2013-08-30 15:57:42
回答 4查看 272关注 0票数 2

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

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

那有什么可能出错呢?)

如果我们假设postgres本身没有关键的漏洞,那么用户可以执行一系列交叉连接并重载数据库。这可以通过会话超时来缓解。

我觉得有很多事情可能会出错,但我很难想出一个清单。

编辑:

根据到目前为止的评论/答案,我应该指出,在任何时候使用这个工具的人数将非常接近于0。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-09-02 14:34:31

除了让用户选择和撤销函数上的特权之外,还想到了一些事情:

  • 只读事务。当事务由BEGIN READ ONLYSET TRANSACTION READ ONLY作为其第一条指令启动时,它不能编写任何东西,这与用户权限无关。
  • 在客户端,如果希望将其限制为一个SELECT,最好使用不接受绑定到其中的多个查询的SQL函数。例如,PHP的瑞士刀PQexec方法确实接受这样的查询,构建在其之上的每个驱动程序函数也是如此,比如PHP的PQexec
  • http://sqlfiddle.com/是一种专门用于运行任意SQL语句的服务,它可以被看作是一种概念的证明,即它可以在不被黑客攻击或DDos‘’ed一整天的情况下完成任务。
票数 1
EN

Stack Overflow用户

发布于 2013-08-30 16:24:04

选择查询不能更改数据库中的任何内容。缺乏dba特权可以保证任何全局设置都不能更改。所以,过载确实是唯一的问题。

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

  • 可以通过在statement_timeout中设置postgresql.conf来排除过于复杂的查询
  • 也可以避免接受一些简单的查询。首先,您可以为每个用户设置并行连接限制(alter userCONNECTION LIMIT)。如果您在用户和postgresql之间有一些接口程序,您还可以另外(1)在每次查询完成后增加一些额外的等待,(2)引入CAPTCHA,以避免DOS的自动攻击。

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

票数 3
EN

Stack Overflow用户

发布于 2013-08-30 16:01:31

问题在于,在会话超时之后,我不确定sql本身是否还会继续在后台运行(通过google也找不到太多的证据,也没有我自己尝试过的任何实际经验)。如果您只选择访问权限,我认为这是可能发生的最糟糕的情况。真正的问题是,如果有100个用户试图执行复杂的交叉连接,会发生什么?会话超时是否删除查询,它将给数据库带来很大的负担(很容易就足以将数据库完全删除)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18537100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档