我对couchdb很新。我们使用couchdb / pouchdb作为反应webapp。它是一个非常简单的应用程序,用户可以在列表中搜索,选择10个收藏夹并将其作为投票提交。排名前十的投票率最高的项目列表也已实施。 一切正常,但我很乐意得到一些反馈用于安全概念。
首次加载时,项目列表数据库通过视图从服务器复制到客户端(沙发到小袋):
db.replicate.from(COUCH_URL + DB_NAME, {
live: true,
filter: '_view',
view: 'items/allItems'
});
物品有“投票”属性。增加用户投票必须在服务器端完成,另一方面要避免冲突,另一方面限制设置+1以外的值。我们不希望wo在couchdb之外使用服务器端代码。
在_design文档中,我们实现了一个更新函数来执行此操作:
{
"_id": "_design/item",
"_rev": "...",
"views": {
"allItems": {
"map": "function(doc) { if (doc.interpreter) emit(doc._id); }"
}
},
"updates": {
"voteForItem": "function(doc, req) {
if (!doc) {
return [null, {
'code': 400,
'json': {
'error': 'missed',
'reason': 'no document to update'
}
}]
} else {
if (!doc.votes) {
doc.votes = 0;
}
doc.votes += 1;
return [doc, {
'json': {
'status': 'ok'
}
}];
}
}"
}
}
然后,连续复制将获取更改的投票值,触发本地更改并使反应集更新视图。
这些是我们为满足我们的需求所做的数据库权限和安全性:
在couchdb中没有太多事情要做:
沙发安全:
validate_doc_update:
所以我们决定使用nginx作为反向代理来定义访问限制:
location /db {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
if ($request_method ~* GET) {
rewrite /db/(.*) /$1 break;
proxy_pass http://localhost:5984;
}
if ($request_method !~* GET) {
return 403;
}
}
location ~ ^/db/(.*)/(_local|_bulk_get|_update) {
rewrite /db/(.*) /$1 break;
proxy_pass http://localhost:5984;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~ ^/db/(.*)/_changes {
rewrite /db/(.*) /$1 break;
proxy_pass http://localhost:5984;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffering off;
}
当然,对couchdb的直接访问限制为127.0.0.1。
具有这些设置的数据库是安全的还是我错过了什么?
您会使用哪种概念或架构?
要限制用户多次投票,只会设置本地邮袋+ Cookie中的标记,因为用户可能不会被强制注册。这当然是“不安全的”,但我们忽略了这一点。