【问题标题】:Is my hack to store users' private data on Cloudant secure?我在 Cloudant 上存储用户私人数据的方法是否安全?
【发布时间】:2013-12-22 14:14:57
【问题描述】:

我想将用户的私人信息存储在 Cloudant 中的 CouchDB 上 - 即每个用户应该只能阅读和更新他自己的文档。 通常此类信息保存在 _users db 中,但我非常喜欢 Cloudant 的 API 密钥,不想自己管理用户和密码。

我在这个 wiki 中找到了几个解决方案: http://wiki.apache.org/couchdb/PerDocumentAuthorization 但它们都有局限性:

  • “每个用户的数据库”管理起来真的很烦人。
  • “智能代理”让 CouchDB 和 CouchApps 充满乐趣。
  • “基于每个用户的文档加密”太复杂了。

然后我想出了一个新的解决方案——我创建了一个数据库(称为“测试”)并将所有用户配置为_writers,没有任何_readers。 为防止用户在彼此的文档上书写,我在_design/app 中将validate_doc_update 设置为:

function(newDoc, savedDoc, userCtx) { 
  if ((userCtx.roles.indexOf('_admin') < 0) && (userCtx.name != newDoc._id)) { 
    throw ({unauthorized: "cannot access others"});
  } 
}

为了让用户阅读自己的文档,我编写了以下更新函数(称为“update_hack”):

function(doc, req) { 
    return [doc, toJSON(doc)];
}

现在,每个用户都可以通过发送 POST 请求来“获取”他的文档:

http://<username>:<password>@<host>/db/_design/app/_update/update_hack/<username>

如果用户尝试向其他用户的文档发送 POST 请求,请说:

http://<username>:<password>@<host>/test/_design/app/_update/update_hack/someoneelse

然后他会因为尝试“更新”文档而收到{"error":"unauthorized","reason":"cannot access others"} 响应。

这个技巧有一些效率低下,因为每次用户“获取”他的文档时,文档的修订版都必须更改。 还有通过发送POST请求来判断用户名是否存在的问题(如果文档不存在,则返回“null”)。

你发现这个技巧有什么安全漏洞吗?

当用户是通过 API 密钥生成时,是否有更好的方法来存储每个用户的私人文档? (即使有,我还是觉得我的把戏很酷)。

【问题讨论】:

  • 我会直接询问 Cloudant。他们反应灵敏。
  • 这是一个非常聪明的技巧!我认为一个不错的方法是在每次以这种方式读取的文档上设置“上次访问”时间戳;-)

标签: security authentication couchdb cloudant


【解决方案1】:

简短回答:没有

长答案:您使用的访问控制并非旨在用作访问控制。这是一种安全反模式,并且一次又一次导致安全漏洞。例如,您如何确保错误消息等不会泄露数据?更新文档呢?

最值得注意的是,“只写”安全方法导致了许多安全漏洞。例如在文件服务器中。

此外,通过使用 POST 获取数据,您将失去所有缓存。

尽管如此 - 您想出了一个非常聪明的技巧。但我强烈建议不要相信它的安全性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-26
    • 2015-07-08
    • 2014-02-07
    • 2017-06-24
    • 2017-06-03
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多