如何避免 CouchDB 和 noSQL 数据库出现类似 SQL 的注入问题?

Posted

技术标签:

【中文标题】如何避免 CouchDB 和 noSQL 数据库出现类似 SQL 的注入问题?【英文标题】:How to avoid SQL-like injection issues with CouchDB and noSQL databases? 【发布时间】:2019-05-07 01:08:54 【问题描述】:

我非常简单的待办事项应用程序将在客户端使用 PouchDb,在服务器端使用 CouchDB。每个条目将首先本地保存在 PouchDB 中,然后将与服务器端 CouchDB 进行复制。该应用程序的每个用户都将在其设备上拥有自己的客户端数据库,以及自己的云数据库,所有这些都具有自己的身份验证。

这篇文章 (Architecture of an app when using CouchDB/PouchDB) 很有帮助,但我仍然在努力解决需要采取哪些步骤来至少尽可能确保用户的输入无害。

我可能比实际情况更多,因为任何不良行为者都可能只会破坏他们自己的数据(那时谁在乎?),但我仍然想知道如何清理用户为 noSQL 数据库输入数据。同样,我在上面引用的帖子有一些很好的起始信息,但我仍然找不到任何关于要注意什么、要转义哪些字符等方面的提示。

根据我对 SQL 的有限经验,您必须留意尝试插入 html 或某些 javascript 的人是有道理的,但我不知道哪些数据序列可能对 CouchDB 有害。我读过的一篇文章建议人们应该:

避免通过将脚本与用户输入连接来创建“临时”JS 命令 使用正则表达式验证在服务器端 JS 命令中使用的用户输入(好主意……但是如何?) 避免评估。使用 json.parse

【问题讨论】:

CouchDB 不允许执行临时 JS “命令”,所以这不是一个真正的问题。您必须做的主要事情是确保用户不能覆盖文档中的重要键。默认情况下,这将是_id_rev,但也可能包括特定于应用程序的键。还要确保您没有暴露足够多的数据库以供用户访问或创建任意数据库(例如 _users)。 @Flimzy 非常感谢您的回复。这是有道理的。您能否指出一个用户如何覆盖重要键的示例?此外,一般来说,一个如何意外暴露太多数据库的示例会很棒。你的意思是以某种方式向用户展示其他键是什么?我很乐意自己做研究,而不必麻烦社区,但除了奇怪的 Stack Q&A 和 CouchDB 文档之外,我找不到任何东西,它们没有深入研究。这就是为什么您的回答非常具体,非常有帮助。再次感谢。 【参考方案1】:

CouchDb 在每个数据库中都有一个验证钩子,您可以使用它来检查或阻止对文档的更新。 the official docs 中有关于此的信息。它是一个设计文档,带有一个用 Javascript 编写的名为 validate_doc_update 的函数,并为您提供原始和修订的文档上下文,以便您可以根据文档的更改“返回”或“抛出”。

【讨论】:

感谢您抽出宝贵时间回复。是的,确实如此。我在我的问题中提到的帖子中发现了这一点。再次感谢。

以上是关于如何避免 CouchDB 和 noSQL 数据库出现类似 SQL 的注入问题?的主要内容,如果未能解决你的问题,请参考以下文章

如何实现noSQL数据库抽象?

SQL(MySQL)与 NoSQL(CouchDB)[关闭]

如何在Ubuntu 20.04 LTS上安装Apache CouchDB

现在最成熟的开源nosql是啥?分别有啥优缺点

「文档数据库之争」MongoDB和CouchDB的比较

使用 PHP 为 couchDB 创建视图