在SELECT中包装查询是否会在Postgres中完全保护您

时间:2014-07-24 10:00:59

标签: postgresql security

给定一个客户端库,只能批量执行一个语句,如果你运行

query.exec_sql("SELECT * FROM (" + sql + ")") 

除了sql之外,SELECT可以运行任何向量吗?

是否还有其他方法可以暂时取消连接,以便只能执行SELECT?

注意:看起来SET ROLE解决了这个问题,但我遇到的问题是我无法以一种简单的方式预先创建一个角色。

2 个答案:

答案 0 :(得分:1)

虽然您可以通过在CTEs中嵌入INSERT / UPDATE / DELETE语句将数据修改语句放入查询中,但它们只允许在顶部等级,所以这不是问题。

但是,您可以调用一个几乎可以包含任何内容的函数。即使您在只读事务中运行它,函数也可能将其提升为读写。

但解决方案很简单:如果您不想让来电者做某事,请不要授权他们这样做。创建仅包含所需{{}}}的用户,您可以按原样执行sql

如果没有定义权限的能力,那么你最接近的可能是查询后的GRANTs和/或显式回滚,但仍然会有漏洞插件(例如,您无法回滚read-only transaction电话)。

答案 1 :(得分:0)

如果sql字符串来自第三方,那么它可以用于SQL注入。我不确定这是不是你问的问题,因为它对于一个56k点的用户来说太基本了。对不起,如果不是这样的话。字符串可以是:

some_table; insert into user_table (user_id, admin_privilege) values (1, true);