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

Security 如何将CouchDB限制为服务器端更新,security,nginx,couchdb,pouchdb,updating,Security,Nginx,Couchdb,Pouchdb,Updating,我对couchdb很陌生。我们将couchdb/PockDB作为react Web应用程序。这是一个非常简单的应用程序,用户可以在列表中搜索,选择10个最喜欢的,并提交这些作为他的投票。此外,还实施了投票最多的前10个项目。 一切正常,但我很高兴能得到一些关于使用的安全概念的反馈 首次加载时,通过视图将项目列表数据库从服务器复制到客户端(沙发到邮袋): db.replicate.from(coach\u URL+db\u NAME{ 现场直播:没错, 筛选器:“\u视图”, 视图:“项目/所有项

我对couchdb很陌生。我们将couchdb/PockDB作为react Web应用程序。这是一个非常简单的应用程序,用户可以在列表中搜索,选择10个最喜欢的,并提交这些作为他的投票。此外,还实施了投票最多的前10个项目。 一切正常,但我很高兴能得到一些关于使用的安全概念的反馈

首次加载时,通过视图将项目列表数据库从服务器复制到客户端(沙发到邮袋):

db.replicate.from(coach\u URL+db\u NAME{
现场直播:没错,
筛选器:“\u视图”,
视图:“项目/所有项目”
});
这些项目具有“投票”属性。必须在服务器端增加用户投票,一方面避免冲突,另一方面限制为设置+1以外的值。我们不想在couchdb之外使用服务器端代码

在一个_设计文档中,我们实现了一个更新功能来实现这一点:

{
“\u id”:“\u设计/项目”,
“_rev”:“…”,
“意见”:{
“allItems”:{
“映射”:“函数(doc){if(doc.解释器)发出(doc._id);}”
}
},
“更新”:{
“voteForItem”:“功能(文件、需求){
如果(!doc){
返回[null{
“代码”:400,
“json”:{
'error':'missed',
'原因':'没有要更新的文档'
}
}]
}否则{
如果(!文件投票){
doc.voces=0;
}
票数+=1;
返回[doc{
“json”:{
“状态”:“确定”
}
}];
}
}"
}
}
然后,连续复制获取更改投票值,触发本地更改并更新视图

这些是数据库权限和安全性,以及我们为满足需求所做的工作:

在couchdb中,没有什么可以做的:

  • 沙发安全:

    • 设置db admin user以限制对设计文档的写入访问
    • 未将db成员用户设置为能够写入投票更改。对于用户,凭据必须在客户端js中,因此这不是更好的选择
  • 验证文档更新:

    • 从那以后这里什么都没有
      • 限制投票属性的更改没有帮助
      • 无法检查请求是否直接来自文档REST url或通过更新功能(在未来版本中可能会有所帮助)
      • 无法在此处更改文档(只是为了增加投票)
因此,我们决定使用nginx作为反向代理来定义访问限制:

位置/db{
代理_重定向关闭;
代理设置头主机$Host;
proxy\u set\u header X-Forwarded-For$proxy\u add\u X\u Forwarded\u For;
if($request_method~*GET){
重写/db/(*)/$1中断;
代理通行证http://localhost:5984;
}
如果($request\u method!~*GET){
返回403;
}
}
位置^/db/(.*)/(_本地| u批量| u获取| u更新){
重写/db/(*)/$1中断;
代理通行证http://localhost:5984;
代理_重定向关闭;
代理设置头主机$Host;
proxy\u set\u header X-Forwarded-For$proxy\u add\u X\u Forwarded\u For;
}
位置^/db/(.*)/\u更改{
重写/db/(*)/$1中断;
代理通行证http://localhost:5984;
代理_重定向关闭;
代理设置头主机$Host;
proxy\u set\u header X-Forwarded-For$proxy\u add\u X\u Forwarded\u For;
代理缓冲关闭;
}
  • 在/db上映射couchdb
  • 仅允许获取以允许复制
  • 允许除GET on\u更新之外的其他更新调用服务器端更新功能
  • 允许使用“本地”和“批量”以外的其他方法使连续复制再次工作
  • 相同的on_更改,但代理_缓冲关闭
当然,对couchdb的直接访问仅限于127.0.0.1

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

您会使用哪个概念或架构

为了限制用户多次投票,仅在本地邮袋中设置一个标志+一个cookie,因为用户可能不会被迫注册。这当然是“不安全的”,但让我们忽略这一点