Security 如何将CouchDB限制为服务器端更新
我对couchdb很陌生。我们将couchdb/PockDB作为react Web应用程序。这是一个非常简单的应用程序,用户可以在列表中搜索,选择10个最喜欢的,并提交这些作为他的投票。此外,还实施了投票最多的前10个项目。 一切正常,但我很高兴能得到一些关于使用的安全概念的反馈 首次加载时,通过视图将项目列表数据库从服务器复制到客户端(沙发到邮袋):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视图”, 视图:“项目/所有项
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或通过更新功能(在未来版本中可能会有所帮助)
- 无法在此处更改文档(只是为了增加投票)
- 从那以后这里什么都没有
位置/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_更改,但代理_缓冲关闭