如何防止使用外部客户端提供的任意 JSONB 查询字符串进行 SQL 注入?

2024-07-04

我有一个由 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 注入。例如,一个简单且可能不充分的解决方案是不允许任何“;”在查询字符串中。


您可以允许用户在 JSON 文档中指定路径,然后在对函数的调用中参数化该路径,例如json_extract_path_text https://www.postgresql.org/docs/10/functions-json.html。也就是说,WHERE 子句如下所示:

WHERE json_extract_path_text(data, $1) = $2

路径参数只是一个字符串,很容易参数化,它描述了向下遍历到给定值的键,例如'foo.bars[0].name'。该子句的右侧将按照与用于固定列过滤的相同规则进行参数化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何防止使用外部客户端提供的任意 JSONB 查询字符串进行 SQL 注入? 的相关文章

随机推荐

  • 如何在新窗口中获取dom元素?

    JavaScript 中的一个简单任务是打开一个新窗口并在其中写入 但我需要在一个dom元素中写入一个带有ID的div var novoForm window open somform html wFormx width 800 heigh
  • Windows 8 - 低延迟音频

    我正在考虑为即将推出的 Windows 8 开发一个应用程序 该应用程序需要低延迟音频录制和播放 我正在尝试找出操作系统是否支持这一点 而不是其他平台 http code google com p android issues detail
  • 替换 Apache POI XWPF 中的文本

    我刚刚发现 Apache POI 库对于使用 Java 编辑 Word 文件非常有用 具体来说 我想编辑一个DOCX使用 Apache POI 的 XWPF 类的文件 我发现没有合适的方法 文档可以执行此操作 有人可以分步骤解释一下如何替换
  • 上传大文件nginx + uwsgi

    堆栈 flask 0 10 uwsgi 1 4 5 nginx 1 2 3 我可以通过我的应用程序上传小文件 CONTENT LENGTH 无效 太大 跳过 nginx 日志没有显示任何有用的内容 我尝试了以下操作 但没有成功 nginx配
  • 如何在 Rust 中包装对使用 VarArgs 的 FFI 函数的调用?

    mexPrintf 就像printf 接受参数的可变参数列表 但我不知道用 Rust 包装它的最佳方法是什么 有一个可变泛型的 RFC https github com rust lang rfcs issues 376 但是今天我们能做什
  • 无法在单例对象中找到隐式值

    我有这个代码 trait Context implicit val e Encoder trait Encoder def write Unit println Test trait AsyncEncoders this Context g
  • getInstance() 不适用于实时数据库中除 us-central1 之外的其他位置

    我正在尝试将用户凭据保存到 Firebase 实时数据库 但是 当我执行该程序时 数据库没有更新 我已正确配置 Firebase 设置 因为身份验证和存储 均为 Firebase 正在运行 build gradle dependencies
  • 如何设置 UWP 应用的默认语言?

    我有2种语言 en US 和 ru Ru 当我将默认语言设置为 ru RU 时 出现错误 PRI257 0xdef00522 找到语言 ru ru en us 的资源 但未找到默认语言的资源 ru RU 改变 默认语言或使用默认语言限定资源
  • 如何在 .proto 文件中处理带有协议缓冲区的通用类型对象?

    我花了一些时间寻找一些替代方法来处理通用对象 我看到了与我类似的问题 但没有我想象的那么具体 协议缓冲区有多种我可以使用的标量类型 但它们大多是原始的 我希望我的消息是灵活的 并且能够有一个作为某种列表的字段 假设我的 proto 文件如下
  • XAML 页面中的 Bindable 值存在问题

    我有一个保龄球回顾示例代码 其中输入了 3 场比赛并总结在系列列中 我遇到的问题是系列列没有按照我的预期进行更新 显然 我做错了什么 但看不到我做错了什么 以下是支持该应用程序的代码
  • 如何覆盖 nltk 的 pos_tag 分配给文本的 POS 标签?

    我使用 nltk 中的 pos tag 来标记一组 未标记的 技术文档中的文本并获得良好的结果 但它总是将 authenticated 等单词标记为动词 而有时它可以用作形容词 换句话说 仅仅改变标签并不是每次都有效 是否有一个好方法来覆盖
  • 嵌入式阵列文档中的 Morphia Mongodb 更新失败

    我是 Morphia 的新手 正在尝试更新嵌入式文档中的字段 这是当前的结构 class A List b BList class B String field 所以我的结构在 MongoDb 中如下所示 id ObjectId 5bab8
  • Python:多 QQ 绘图

    我是新人 通常来自 R 我想创建一个包含多行的 QQ Plot 我有一个测试版分布式数据集 我想尝试不同的 beta 分布参数并在oneQQ Plot 以便更好地进行比较 如果我尝试下面的代码 每个图都有相同的颜色 并且我得到 3 条 QQ
  • 我可以通过 Reflection 获取私有财产的价值吗?

    它似乎不起作用 ref new ReflectionObject obj if ref gt hasProperty privateProperty print r ref gt getProperty privateProperty 它进
  • Gulp Uglify 选项不适用

    您好 我正在为我工 作的公司制作一个主题 JS 部分无法在 uglify 中正确构建 我正在尝试使用 uglify 来简单地连接我的文件 这可以工作 但它们输出缩小和损坏 没有注释 我不明白为什么 下面是我的 gulp 任务 它运行正确 但
  • 如何在 ADF Oracle 11gR1 中的对话框窗口中的弹出窗口中刷新表

    我正在研究显示一个带有搜索表的弹出窗口的要求 当用户单击弹出窗口中的搜索按钮 提供输入文本框 时 需要使用新的数据集刷新搜索表 我创建了一个populateSearchTable 通过填充数组中的值来生成表的方法deviceListArra
  • MVC3 – ViewModel 和控制器功能:建议的设计模式

    我为一个不太可用的呼叫中心应用程序构建了一个简单的基于 MVC3 的票务输入站点 并尝试重构我的原型以更好地遵循设计模式 部分原因是为了使其更易于维护 但主要是作为一种学习练习 面向用户的视图是一种由基本用户信息以及允许选择各种资源类型的面
  • 将分层(树状)XML 读入 pandas 数据帧,保留层次结构

    我有一个 XML 文档 其中包含分层的树状结构 请参阅下面的示例 该文档包含几个
  • 尝试访问 USB 设备时出现 RPC_E_CANTCALLOUT_ININPUTSYNCCALL

    我有这段代码 var searcher new ManagementObjectSearcher root CIMV2 SELECT FROM Win32 DiskDrive foreach var queryObj in searcher
  • 如何防止使用外部客户端提供的任意 JSONB 查询字符串进行 SQL 注入?

    我有一个由 PostgreSQL 数据库支持的基本 REST 服务 其中有一个包含各种列的表 其中之一是包含任意数据的 JSONB 列 客户端可以将数据填充存储在固定列中 并提供任何 JSON 作为存储在 JSONB 列中的不透明数据 我希