Firebase防止泄露电子邮件帐户的存在



通常认为泄漏是否为一个电子邮件是否与您的网站注册。然而,我正在努力寻找一种方法来阻止Firebase呼叫泄露此信息。在这个问题中,部分问题得到了解决——如果电子邮件没有注册,Firebase将以400状态响应并泄漏一个错误。给出的解决方案是在进行重置调用之前测试电子邮件是否已注册。这仍然很容易找到泄漏的信息-如果你看一下网络日志。下面是一个例子:

<<p>账户存在/strong>:图片

帐户不存在帐户不存在

如你所见,在邮件存在的情况下,会有额外的调用。

下面是显示实现细节的代码片段:

//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认证重置用户密码而不泄漏是否存在帐户?

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

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

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

对于那些想要混淆正在泄露的信息的人(因为你无法阻止它——详见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 + '"}',
});

来源

最新更新