我的hack是否将用户的私有数据存储在Cloudant上?

时间:2013-12-05 15:03:43

标签: security authentication couchdb cloudant

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

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

  • “每用户数据库”真的很难管理。
  • “智能代理”从CouchDB和CouchApps中获取乐趣。
  • “基于每个用户的文档加密”太复杂了。

然后我找到了一个新的解决方案 - 我创建了一个数据库(称为“test”)并将所有用户配置为_writer s,没有任何_reader s。 为防止用户撰写其他文档,我将validate_doc_update中的_design/app设置为:

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密钥生成时,是否有更好的方法来存储每个用户的私人文档? (即使有,我仍然觉得我的伎俩很酷)。

1 个答案:

答案 0 :(得分:0)

简短回答:否

长答案:您正在使用某种不用于访问控制的东西来进行访问控制。这是一种安全性反模式,并且有一段时间会导致安全漏洞。例如,如何确保错误消息等不会泄漏数据?如何更新文档?

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

通过使用POST来获取数据,您也会丢失所有缓存。

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