2011-01-19 75 views

回答

22

是的,CouchDB可以防止未经授权的读取。不幸的是,它不那么简单。

想象一下秘密拍卖应用程序。你出价20美元,我出价10美元;每个出价在沙发文件。沙发让我们阅读我们自己的投标文件,但没有其他人。 但是,有一个显示平均值的map-reduce视图。我加载视图并查看平均值为15美元,因此我认为您的出价为20美元,并且我违反了安全策略。 视图输出可能泄漏部分或全部文档的信息。在文档级执行安全措施是不可行的。这就是读访问权限在数据库级别的原因。

我知道,它吮吸。但这是唯一正确的,可扩展的答案。

这是部分原因的沙发理念是为每个用户创建许多数据库—甚至一个(或多个)。对数据库的读取权限设置为数据库_security对象的readers值。 (请注意,现场readers was renamed to members CouchDB中主干,因为它也指定谁可以写入到数据库。)

该技术的工作原理是这样的:

  1. 为每个用户创建一个数据库。它将保存用户可能读取的所有文档。将用户(或用户的角色)添加到_security对象。
  2. 在master数据库中,创建一个实现读取策略的过滤函数。从主数据库到用户与?filter=my_filter_function数据库(这可能与validate_doc_update共享代码。)
  3. 复制。
  4. 允许用户加载(或复制)他们的数据库。

当然,这完全是为了一个纯粹的Couch应用程序,用户可以直接访问Couch。如果你有一个中间层(MVC控制器,或者只是一个反向HTTP代理),那么你可以在用户和沙发之间执行策略。但要小心。例如,_show函数或_rewrite规则可能允许用户加载视图或文档,而不考虑您的策略。

祝你好运!

+0

谢谢!您能否详细说明_show和_rewrite如何咬我?此外,我如何避免竞争状况,如“不友好的人 - >上传照片”,并且100%确信这位不受邀请的人永远看不到那张照片? – nornagon

+0

那么,假设你有一个反向代理,它允许/拒绝每个用户根据URL访问每个文档。稍后,您使用_list函数添加新功能,并且代理允许所有_list查询。用户可能会想出如何使用_list来查看他不应该看到的文档。同样,一个_rewrite规则可以提供一种方法来查看没有正常的'/ db/doc_id'路径的文档。所以你必须非常确信你的代理没有漏洞。 – JasonSmith

+2

你的第二个问题更多的是关于**取消**读取权限而不是**授予**读取权限。我建议你问一个新问题(“如何撤销CouchDB安全模型中的读取访问权限”)。如果可以的话,我会尽快答复! – JasonSmith