Postgres自定义查询,过滤自定义查询的数据

时间:2015-01-12 14:00:18

标签: sql postgresql plpgsql

我的目标是使用PLPGSQL功能创建一个系统,允许我的用户创建和运行他们数据的自定义报告。

CREATE FUNCTION run_report(query TEXT, filter JSON) RETURNS JSON AS 
$$
  ...run and return report as JSON
$$ LANGUAGE PLPGSQL;

将有一个表格菜单,比如foo1,foo2,foo3,foo4,并了解它们之间的关系。

我希望他们能够上传查询,然后动态应用过滤器。例如: -

WITH CTE AS (
         SELECT baa, baa2, baa3#>'{ids}' as ids FROM foo1 
         LEFT JOIN foo2 USING(foo_id)
         WHERE_CLAUSE_TO_INSERT
) SELECT json_agg(row_to_json(CTE.*)) FROM CTE

我的函数将WHERE_CLAUSE_TO_INSERT替换为从发送过滤器构造的where子句,如下所示: -

{
 "baa2.id"  : "12",
 "baa.name" : "John.*'
}

这将使WHERE_CLAUSE_TO_INSERT" baa2.id :: TEXT~' 12'和baa.name〜' John。*'

我是通过创建一个如下所示的数组来实现的: -

["baa2.id::TEXT ~'12'"," baa.name ~ 'John.*'"]

然后使用: -

创建字符串
array_to_string(where_clause, ' AND ')

问题

我猜这是开放的SQL注入。通常我会使用$ 1,$ 2 ...占位符构建一个查询并使用 EXECUTE' SELECT ... WHERE foo = $ 1'使用bar_variable 。问题是其中一些查询很复杂,我不知道将传递多少参数。

有更好的方法吗?

0 个答案:

没有答案