【问题标题】:CouchDB - Figuring out database securityCouchDB - 弄清楚数据库的安全性
【发布时间】:2011-04-06 06:54:16
【问题描述】:

CouchDB 在允许将对象/行插入数据库之前提供验证。这可以确保如果您有一个面向公众的沙发应用程序,您的数据库不会被任何人填满垃圾。

User <-> CouchDB

但是,我想从您拥有trusted middle layer that does much of the auth work 的标准应用程序设计流程中弄清楚这是什么样的。例如,大多数应用程序将 Ruby 或 PHP 放在数据库和用户代理之间,这允许应用程序在允许将诸如帖子之类的内容保存到数据库之前找出有关用户代理的信息。

User -> Ruby -> MySQL
User <- Ruby <- MySQL

当用户无法被信任时,您如何信任用户执行管理任务?

例如,在仅使用 couchDB 插入用户行之前,您将如何执行“电子邮件验证”之类的操作?您不能让 用户代理插入行 - 因为它们会在系统中填满垃圾邮件帐户。另一方面,也没有中间层可以在他们单击电子邮件中的链接后插入行。

怎么样,我假设您将允许任何人通过在email_verify 等公共表中创建新记录来输入他们的电子邮件。这是公共用户代理可以做的事情,因为表在应用程序中不会做任何事情 - 它只是一个储水池。

然后 node.js 可以跟踪 _changes 提要并发送激活电子邮件,同时在私有表中创建新条目(如email_confirm)(node.js 将充当受信任的中间层)。如果用户单击该链接并返回然后... [未知] ... node.js 最终可以在私有用户表 (user) 中创建一条记录。

此时,我们可以依赖 couchdb 验证对应用程序的其余部分进行验证,因为我们创建了一个确认的用户帐户。

更多背景让我们想象一下基于 couchdb 的讨论,任何人都可以注册。我们不想让任何人在没有经过某种验证的情况下直接提交内容 - 但用户代理都直接运行系统。 (表格为ThreadCommentUser)。这将如何运作?

【问题讨论】:

  • 我不明白“表格”是什么意思?你说的是数据库吗?

标签: security nosql couchdb validation


【解决方案1】:

我会考虑在这个问题中为现有用户添加角色。

使用 couchdb 的验证和更改 _design/_auth 是一个好主意,可以在用户首次注册时在 _users 数据库中添加 emailemail_verified 和随机生成的 email_verification_code

要发送邮件、获得确认、重新发送确认,您可以使用外部流程。 (有关外部进程的示例用法,您可以查看 couchdb-lucene)。

最后,如果验证码匹配,您可以再次在用户更新过程中快速检查 _design/_auth 并为该用户添加verified_user 角色。

这样你的所有请求都会通过 couchdb,只有当你需要发送邮件并得到确认时,你才会使用外部进程。

编辑:忘了添加(因为它很明显),我会添加verified_user 角色到数据库阅读器。

【讨论】:

    【解决方案2】:

    你不能直接使用CouchDb's Validation 吗?

    可能会标记用户。注册后,用户将添加到用户数据库中。他收到他的邮件,然后在回复该邮件或单击链接时被标记为“有效:真”或类似的东西。

    通过验证,用户不仅可以“登录/注销”,还可以通过更精细的访问权限实现访问授权。例如:仅在作者、管理员等任何人时标记已解决的线程...

    或者这似乎不切实际?

    【讨论】:

    • 这在实际工作程序中会是什么样子?谁将用户标记为“有效:真”?目标是用户运行数据库——但用户不能信任这样的东西,所以这意味着“中间件”解决方案(如 Node.js 或 PHP)必须进来,对吗?或者是否可以使用 100% 纯 couchDB 来解决此类问题?
    • 好问题。数据库是通过复制(沙发应用程序?)分发给用户还是“用户运行数据库”是什么意思?如果您正在谈论将数据库复制到用户的本地 couchdb 实例,那么您可以在“主”应用程序中处理此问题,用户还必须配置复制到他们的 couchdb。另一方面,这也让我很头疼:你怎么能禁止用户将“你的”应用程序数据库复制到其他地方......我必须说,我不是一个训练有素的 CouchDB 开发人员,所以第二意见在这里真的很重要。
    • 嗯,我运行 couchdb 应用程序的目标是它是自给自足的(不依赖 Apache 或 Ruby/Python/PHP 来运行)。由于 couchdb 可以处理 1,000 个并发用户(给他们 _design/_view/_attachment 文档),我可以将大量逻辑“卸载”到 JavaScript 中,让他们的机器处理所有内容,而不是在服务器上运行 PHP 或 Ruby。因此,从本质上讲,我可以用纯 HTML 和 JavaScript 构建应用程序,并在用户浏览器中运行它,以充分利用 CouchDB 的强大功能。换句话说,我希望 CouchDB 成为我运行网站所需的唯一东西。
    • 哦,目前我并不真正关心复制到用户机器上。虽然这是一个简洁的功能,但我需要弄清楚如何使用。 ;)
    • 您查看过“_users”数据库吗?我认为一种选择是将用户分成不同的组,对您的数据库具有不同的读/写访问权限?
    【解决方案3】:

    在与#couchdb IRC 上的一些人交谈之后,他们似乎无法找到一种方法来执行管理操作(例如激活用户单击电子邮件链接)而不使用“后端”流程,例如跟踪 _changes 提要的 node.js 服务器。

    我希望有一个纯粹的 couchdb 应用程序 - 但似乎 couchdb 还有一些路要走。

    不过,好消息是您可以将 80% 的应用程序逻辑/处理交给用户。其他 20% 将是 1)一个 node.js 实例,用于发送电子邮件或检查 recaptcha 和 2)在你的 couchdb 中运行的记录验证功能,以及 3)map/reduce(查询)功能。这三件事不能卸载到像用户代理这样“不受信任”的东西上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 2017-08-30
      • 2019-05-27
      • 2013-05-19
      • 1970-01-01
      相关资源
      最近更新 更多