如何攻击Firebase数据库规则?

时间:2019-01-30 01:17:16

标签: ios firebase security websocket sniffing

我正在为iOS应用程序使用Firebase。我试图了解我的规则必须严格到什么程度,所以我试图自己攻击它们。我的想法是,如果我能找到规避真正宽松规则的方法(例如允许使用.read和.write或只是要求授权),那么我可以根据需要构建更多规则。

我对我的凭据的安全性非常有信心,因此攻击者将不得不使用代理来嗅探流量,并以某种方式使用其授权令牌对Firebase数据库进行自己的调用。用户将能够使用什么方法来获取其授权令牌(通过嗅探代理通信或其他方式)来对数据库进行自己的调用? iOS上的Firebase SDK似乎使用了websocket,而嗅探网络流量的工具(如Charles Proxy)似乎并不轻松地支持iOS的websocket嗅探,因此我应该清楚地知道我的应用中没有任何数据库规则吗? / p>

简而言之,有什么方法可以通过劫持我的Firebase授权令牌来充当坏演员并攻击自己的数据库?如果没有,我真的需要担心数据库规则吗?

2 个答案:

答案 0 :(得分:2)

您可能会遗漏要点。

安全规则可用于限制特定用户的操作。该使用是否获得合法凭证不是您关注的问题。 用户可以通过多种方式将其凭据放弃给攻击者,并且您无能为力,因此请不要阻止这种情况的发生。如果您担心嗅探或网络钓鱼,只需知道它是您无法控制的,并且如果泄露,用户的设备可以放弃每条私人信息。只需确保每个用户都可以做您所允许的事情,而无需尊重其他任何事情。

除每个用户规则外,您仅应关注未经身份验证的用户可以在数据库中执行的操作。如果允许任何未经身份验证的读取或写入,则需要仔细考虑并仔细编写规则。理想情况下,除非在非常受控的情况下,否则不允许公开写信。

答案 1 :(得分:0)

除了Doug Stevenson所说的以外,值得一提的是,就对象结构而言,限制用户可以写入数据库的内容。

我个人使用Firebase Bolt简化了过程。

如果您希望用户写入包含firstNameemailAddress的帐户对象,则可以将螺栓标记写为;

type Accounts {
  emailAddress: String,
  firstName: String
}

path /accounts/{uid} is Accounts {
  create() { auth != null && auth.uid == uid; }
  update() { auth != null && auth.uid == uid; }
}

这有助于保持数据干净,并限制用户破坏逻辑。如果他们拥有对节点的平坦.write访问权限,则他们可以删除数据,或创建可能导致问题的非结构化对象。定义模型有助于保护/维护数据库的完整性。