我的目标是使用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 。问题是其中一些查询很复杂,我不知道将传递多少参数。
有更好的方法吗?