Ore*_*ren 8 security authentication couchdb cloudant
我想将用户的私人信息存储在Cloudant中的CouchDB上 - 即每个用户应该只能阅读和更新他自己的文档.通常这些信息保存在_users db中,但我真的很喜欢Cloudant的API密钥,并且不想自己管理用户和密码.
我在这个wiki中找到了几个解决方案:http: //wiki.apache.org/couchdb/PerDocumentAuthorization 但它们都有局限性:
然后我想出了一个新的解决方案 - 我创建了一个数据库(称为"测试")并将所有用户配置为_writers,没有任何_readers.为了防止用户写下彼此的文档,我validate_doc_update在以下内容中设置_design/app:
function(newDoc, savedDoc, userCtx) {
if ((userCtx.roles.indexOf('_admin') < 0) && (userCtx.name != newDoc._id)) {
throw ({unauthorized: "cannot access others"});
}
}
Run Code Online (Sandbox Code Playgroud)
为了让用户阅读他们自己的文档,我编写了以下更新函数(称为"update_hack"):
function(doc, req) {
return [doc, toJSON(doc)];
}
Run Code Online (Sandbox Code Playgroud)
现在,每个用户都可以通过发送POST请求来"获取"他的文档:
http://<username>:<password>@<host>/db/_design/app/_update/update_hack/<username>
Run Code Online (Sandbox Code Playgroud)
如果用户尝试向其他用户的文档发送POST请求,请说:
http://<username>:<password>@<host>/test/_design/app/_update/update_hack/someoneelse
Run Code Online (Sandbox Code Playgroud)
那么他会得到一个{"error":"unauthorized","reason":"cannot access others"}回应,试图"更新"文件.
这种技巧效率低下,因为每次用户"获取"他的文档时,文档的修订都必须改变.还存在通过发送POST请求来实现用户名是否存在的问题(如果文档不存在,则将返回"null").
你觉得这个技巧有什么安全漏洞吗?
当用户通过API密钥生成时,是否有更好的方法来存储每个用户的私人文档?(即使有,我仍然认为我的伎俩很酷).
简短回答:不
长答案:您正在使用某些东西来进行访问控制,但其设计目的并不是用作访问控制。这是一种安全反模式,并且一次又一次地导致安全漏洞。例如,如何确保错误消息等不会泄漏数据?更新文档怎么样?
最值得注意的是,“只写”安全方法导致了许多安全漏洞。例如在文件服务器中。
另外,通过使用 POST 获取数据,您会丢失所有缓存。
尽管如此 - 你想出了一个非常聪明的技巧。但我强烈建议不要相信它的安全性。
| 归档时间: |
|
| 查看次数: |
847 次 |
| 最近记录: |