4

我正在尝试按照协作待办事项列表的方式使用 Firebase 构建 Web 应用程序。每个用户组都有一个共享列表,要让某个人有权访问特定列表,他们必须已经启动了该组,或者被邀请加入该组。邀请将通过电子邮件发送,包括以前未使用过该网站的用户。我的目标是避免使用服务器端代码,我正在使用 AngularJS。每个组的列表都有自己的 URL。

使用 Facebook 或用户名和电子邮件登录该网站。我认为有一种方法可以通过 Facebook 邀请其他 Facebook 用户,但我宁愿避免使用 Facebook 应用程序,并且为了简单起见,我想坚持一个通用的邀请系统供用户使用,无论他们是否已登录。因此我打算使用该系统像这样工作:

该组的现有成员将输入预期的新成员的电子邮件地址。JavaScript 会生成一个随机的字母数字令牌,该令牌用于创建邀请 Firebase 位置的新子代,如下所示

"invites": {
    "12345ABC": "Group Name"
},

使用这些安全规则

"invites": {
    ".read": false,
    ".write": false,
    "$token": {
        ".read": true
    }
}

这样,您只能在知道令牌存在时才能读取令牌。

以令牌结尾的群组共享列表的电子邮件地址和 URL 将作为子项添加到 Firebase 中的电子邮件队列位置。Zapier(或类似的)然后检测到这个孩子添加的事件,并通过邀请 URL 向收件人发送电子邮件。email_queue 只能被 Zapier 或其他 cron 类型的东西读取,以保护受邀者的隐私。(编辑:Zapier 提供了删除它操作的位置的选项,为了节省空间,我想我会使用它)。

一旦用户使用 Facebook 登录或使用电子邮件和密码注册帐户,点击他们收到的链接的用户就会被添加到群组中。

以上是明智的还是有我没有看到的安全漏洞?

附带问题:因为我看不到维护计数器的安全方法,是否有任何方法可以阻止拥有一长串电子邮件地址的恶意用户通过触发大量邀请来破坏系统,从而达到电子邮件提供商的发送限制? (Zapier 似乎没有提供这一点)。

4

1 回答 1

1

是的,如果像上面这样指定,非受邀用户将无法猜测令牌。确保在邀请分支上方的任何地方都没有读取条件评估为真。

侧面回答:

我可以想到一个hacky的方式来做到这一点。如果您的令牌是固定长度的,您可以维护另一个字段,该字段是用户将要发送的令牌的分隔字符串连接。然后要添加新邀请,首先将其附加到集合字符串,然后将其添加到邀请列表。使用安全表达式 .contains 强制用户邀请令牌集合中存在新令牌。

这不是一种实时的做事方式,但对于小型邀请列表可能没问题。使用安全性强制邀请集合的大小低于某个大小。使用一些时间戳逻辑来允许用户在自上次附加到令牌列表以来已经有一段时间清除列表。

于 2014-06-20T16:54:51.623 回答