CouchDB-防止未经授权的读取

CouchDB-防止未经授权的读取,couchdb,Couchdb,CouchDB具有防止未经授权写入的机制 它还能防止未经授权的读取吗?是的,CouchDB可以防止未经授权的读取。不幸的是,它稍微不那么直截了当 想象一个秘密拍卖应用程序。你出价20美元,我出价10美元;每份投标书都包含在一份文件中。Coach允许我们阅读自己的投标文件,但不允许阅读其他文件。但是,有一个map reduce视图显示平均值。我加载视图,看到平均值是15美元,所以我得出结论,您的出价是20美元,我已经违反了安全策略查看输出可能泄漏文档的部分或全部信息。在文档级别强制执行安全性是不可

CouchDB具有防止未经授权写入的机制


它还能防止未经授权的读取吗?

是的,CouchDB可以防止未经授权的读取。不幸的是,它稍微不那么直截了当

想象一个秘密拍卖应用程序。你出价20美元,我出价10美元;每份投标书都包含在一份文件中。Coach允许我们阅读自己的投标文件,但不允许阅读其他文件。但是,有一个map reduce视图显示平均值。我加载视图,看到平均值是15美元,所以我得出结论,您的出价是20美元,我已经违反了安全策略查看输出可能泄漏文档的部分或全部信息。在文档级别强制执行安全性是不可行的。这就是为什么读取访问是在数据库级别进行的。

我知道,这很糟糕。但这是唯一正确的、可扩展的答案

这也是沙发理念创建多个数据库的部分原因,甚至每个用户创建一个(或多个!)。对数据库的读取权限是在数据库
\u security
对象的
读卡器
值中设置的。(注意CouchDB trunk中的字段,因为它还指定了谁可以写入数据库。)

该技术的工作原理如下:

  • 为每个用户创建一个数据库。它将保存用户可能阅读的所有文档。将用户(或用户角色)添加到
    \u security
    对象
  • 在主数据库中,创建一个实现读取策略的筛选函数。(它可以与
    validate\u doc\u update
    共享代码)
  • 使用
    ?filter=my\u filter\u函数
    从主数据库复制到用户数据库
  • 允许用户加载(或复制)其数据库
  • 当然,这是一个纯沙发应用程序的全部,用户可以直接访问沙发。如果您有一个中间层(MVC控制器,或者只是一个反向HTTP代理),那么您可以在用户和沙发之间执行策略。但是要小心。例如,
    \u show
    函数或
    \u rewrite
    规则可能允许用户加载视图或文档,而不考虑您的策略


    祝你好运

    谢谢!你能详细说明一下,你的表演和重写会对我有什么影响吗?另外,我如何避免“与某人解除好友关系->上传照片”这样的竞争条件,并100%确保未与好友建立好友关系的人永远看不到照片?好吧,假设您有一个反向代理,允许/拒绝每个用户基于URL访问每个文档。稍后,您将使用_list函数添加一个新功能,并且代理允许所有的_list查询。用户可能知道如何使用_列表查看他不应该查看的文档。类似地,重写规则可以提供一种在没有正常
    /db/doc\u id
    路径的情况下查看文档的方法。所以你必须确保你的代理没有漏洞。你的第二个问题更多的是关于撤销读访问权而不是授予读访问权。我建议您提出一个新问题(“如何在CouchDB安全模型中撤销读取访问”)。如果可以的话,我会试试答案!为每个用户创建数据库需要应用程序知道AFAIK的服务器管理员凭据。考虑到可以使用相同的凭据清除集群上运行的所有数据库,这难道不是一种风险吗?