给定一个客户端库,只能批量执行一个语句,如果你运行
query.exec_sql("SELECT * FROM (" + sql + ")")
除了sql
之外,SELECT
可以运行任何向量吗?
是否还有其他方法可以暂时取消连接,以便只能执行SELECT?
注意:看起来SET ROLE解决了这个问题,但我遇到的问题是我无法以一种简单的方式预先创建一个角色。
答案 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);