2016-02-29 43 views
0

使用Firebase中的事务是自动修改数据的好方法,但我怎么知道用户实际上使用我的代码插入数据?Firebase安全性 - 事务

例如,如果用户获得对数据位置的引用(使用浏览器控制台)并使用set覆盖以前的数据而不是单击我在后台使用transaction的预先设计的按钮?

更新(例子):

var wilmaRef = new Firebase('https://docs-examples.firebaseio.com/samplechat/users/wilma'); 
wilmaRef.transaction(function(currentData) { 
    if (currentData === null) { 
    return { name: { first: 'Wilma', last: 'Flintstone' } }; 
    } else { 
    console.log('User wilma already exists.'); 
    return; // Abort the transaction. 
    } 
}); 

现在,如果有什么用户使用:

wilmaRef.set({name: { first: 'Wilma', last: 'Flintstone' }}); 
+0

下面的高级答案。但是就像你之前的那个一样,这个问题并不适合堆栈溢出格式。添加特定的数据结构和示例代码以使其更好地适应。 –

+0

@FrankvanPuffelen用示例更新了问题 –

+0

它仍然是[XY问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。两种操作都有相同的结果。你试图阻止什么样的滥用?例如:“我想让用户只指定一次他们的名字,之后他们不能改变它”。如果您在[Firebase安全性和规则指南](https://www.firebase.com/docs/security/guide/index.html)上花费了一些时间,您会找到实现此目的的示例。 –

回答

1

的火力地堡数据库没有办法,以确保它是使一个特定的代码块修改。查看我对这个问题的回答,了解为什么了解资源的URL不是安全风险:How to restrict Firebase data modification?

Firebase安全性基于知道用户是谁,并根据这些知识为他们提供特定的读/写操作。一旦采取了这种思维方式,如果有人使用JavaScript控制台更改Android应用程序后面的数据库,则无关紧要。只要JavaScript遵循您为运行它的用户设置的规则,就可以对数据库进行更改。

+0

感谢您的回答,但是如果您授予特定网址的写入权限,那么如何确保通过交易完成写入,而不是'set' –

+1

就像没有“我怎样才能确保只有我的应用程序可以编写?“,也没有”如何确保只有一个事务可以使用?“。交易允许您使用当前值来确定新值。在你的安全规则中,你也会验证这样的转换。 –