【问题标题】:Firebase prevent leaking existence of email accountFirebase 防止泄露电子邮件帐户的存在
【发布时间】:2021-05-29 23:14:51
【问题描述】:

通常认为泄露一个 电子邮件是否已在您的网站上注册。但是,我正在努力寻找一种方法来阻止 Firebase 调用泄露这些信息。在这个question 中,部分问题得到了解决——Firebase 将响应 400 状态并在电子邮件未注册的情况下泄漏错误。给出的解决方案是在拨打重置电话之前测试电子邮件是否已注册。这仍然会泄露很容易找到的信息 - 如果您查看网络日志。下面是一个例子:

帐户存在Account Exists Picture

帐户不存在 Account Does Not Exist

如您所见,如果电子邮件确实存在,则会进行额外调用。

下面是一个显示实现细节的 sn-p:

//need to handle attempting to reset password
try {
    const signInOptions = await firebase.auth().fetchSignInMethodsForEmail(data.email);
    if(signInOptions.length > 0)
        await firebase.auth().sendPasswordResetEmail(data.email);
    setStatementMessage('Email sent');
} catch(e) {
    if(e === 'auth/user-not-found') {
        setStatementMessage('Email sent'); 
    }
    console.log(e);
}

如何使用 Firebase Auth 重置用户密码而不泄露是否存在帐户?

【问题讨论】:

  • 如果有人可以看到网络日志,那么他们将能够看到用户所做的一切,包括他们用来登录的密码,所以没有办法设计这样的信息不' t 存在于网络日志中。但是,您可以使用 HTTPS 来防止他人嗅探用户的流量。

标签: firebase authentication firebase-authentication


【解决方案1】:

我不认为有线协议的状态代码在这里有什么不同:fetchSignInMethodsForEmail 方法的全部目的是找出某个特定的电子邮件地址是否在 Firebase 项目中使用。

如果您使用 Firebase 身份验证,任何人都可以获取您项目的配置数据,并使用特定值调用此 API 以测试这些是否已注册。

这种行为是 Firebase 身份验证(以及我所知道的大多数其他无服务器身份验证系统)所固有的,不能被禁用或规避。

【讨论】:

  • 弗兰克,感谢您的回复。我现在看到这是真的 - 任何人都可以使用您的公共 apiKey 查询 API。似乎没有办法隐藏哪些电子邮件持有帐户。
【解决方案2】:

对于那些希望混淆被泄露信息的人(因为您无法阻止它 - 有关详细信息,请参阅 Frank 的回答),您可以通过直接调用在后端实现此功能:

fetch('https://www.googleapis.com/identitytoolkit/v3/relyingparty/getOobConfirmationCode?key=[public apiKey]', 
    {
        method: 'POST',
        headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json'
        },
        body: '{"requestType":"PASSWORD_RESET","email": "' + request.body.email + '"}',
    });

Source

【讨论】:

    猜你喜欢
    • 2019-02-13
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 2020-07-19
    相关资源
    最近更新 更多