我有一个由 PostgreSQL 数据库支持的基本 REST 服务,其中有一个包含各种列的表,其中之一是包含任意数据的 JSONB 列。客户端可以将数据填充存储在固定列中,并提供任何 JSON 作为存储在 JSONB 列中的不透明数据。
我希望允许客户端在固定列和 JSONB 上都有约束的情况下查询数据库。翻译一些查询参数很容易,例如?field=value
并将其转换为固定列的参数化 SQL 查询,但我也想向 SQL 添加任意 JSONB 查询。
这个 JSONB 查询字符串可能包含 SQL 注入,我该如何防止这种情况?我认为因为 JSONB 数据的结构是任意的,所以我不能使用参数化查询来实现此目的。我能找到的所有文档都表明我使用参数化查询,并且我找不到有关如何实际清理查询字符串本身的任何有用信息,这似乎是我唯一的选择。
例如类似的问题是:如何防止 PostgreSQL JSON/JSONB 字段中的 SQL 注入? https://stackoverflow.com/questions/54117802/how-to-prevent-sql-injection-in-postgresql-json-jsonb-field
但我不能应用相同的解决方案,因为我不知道 JSONB 或查询的结构,我不能假设客户端想要使用特定运算符查询特定路径,整个 JSONB 查询需要自由由客户提供。
我在用着golang,以防我可以使用任何现有的库或代码片段。
编辑:客户端可能对 JSONB 执行的一些示例查询:
(content->>'company') is NULL
(content->>'income')::numeric>80000
content->'company'->>'name'='EA' AND (content->>'income')::numeric>80000
content->'assets'@>'[{"kind":"car"}]'
(content->>'DOB')::TIMESTAMP<'2000-01-30T10:12:18.120Z'::TIMESTAMP
EXISTS (SELECT FROM jsonb_array_elements(content->'assets') asset WHERE (asset->>'value')::numeric > 100000)
请注意,这些并没有涵盖所有可能的查询类型。理想情况下我想要anyPostgreSQL 支持对允许的 JSONB 数据进行查询。我只是想检查查询以确保它不包含 sql 注入。例如,一个简单且可能不充分的解决方案是不允许任何“;”在查询字符串中。