如何将CouchDB限制为服务器端更新

时间:2017-02-14 13:46:16

标签: security nginx couchdb pouchdb updating

我对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中没有太多事情要做:

  • 沙发安全:

    • 设置db admin用户以限制对设计文档的写访问权
    • 未设置db成员用户能够写入投票更改。与用户的凭据必须在客户端js,所以这不是更好
  • validate_doc_update:

    • 此后没有任何内容
      • 限制对投票属性的更改没有帮助
      • 无法检查请求是否直接发送到文档REST网址或更新功能(在将来的沙发版本中可能会有所帮助)
      • 这里不可能更改文档(只是增加投票)

所以我们决定使用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;
}
  • 在/ db
  • 上映射couchdb
  • 仅允许GET允许复制
  • 允许_updates以外的GET调用serverside update function
  • 允许_local和_bulk_get上的GET以外的其他复制工作
  • 在_changes上相同,但关闭了proxy_buffering

当然,对couchdb的直接访问限制为127.0.0.1。

具有这些设置的数据库是安全的还是我错过了什么?

您会使用哪种概念或架构?

要限制用户多次投票,只会设置本地邮袋+ Cookie中的标记,因为用户可能不会被强制注册。这当然是“不安全的”,但我们忽略了这一点。

0 个答案:

没有答案