Firebase Web-App指南指出,我应该把给定的apiKey放在我的Html来初始化Firebase:
// TODO: Replace with your project's customized code snippet
<script src="https://www.gstatic.com/firebasejs/3.0.2/firebase.js"></script>
<script>
// Initialize Firebase
var config = {
apiKey: '<your-api-key>',
authDomain: '<your-auth-domain>',
databaseURL: '<your-database-url>',
storageBucket: '<your-storage-bucket>'
};
firebase.initializeApp(config);
</script>
这样,apiKey就暴露给了每个访问者。
这个密钥的目的是什么?它真的是要公开的吗?
当启用用户/密码注册时,API密钥暴露会产生漏洞。有一个开放的API端点,它接受API密钥,并允许任何人创建一个新的用户帐户。然后,他们可以使用这个新帐户登录到受Firebase Auth保护的应用程序,或使用SDK进行user/pass认证并运行查询。
我已经向谷歌报告了这一点,但他们说它正在按照预期工作。
如果您不能禁用用户/密码帐户,您应该执行以下操作:
创建一个云函数来自动禁用新用户onCreate,并创建一个新的DB条目来管理他们的访问。
Ex: MyUsers/ (userId) /Access: 0
exports.addUser = functions.auth.user().onCreate(onAddUser);
exports.deleteUser = functions.auth.user().onDelete(onDeleteUser);
更新规则,只允许访问> 1的用户读取。
监听器函数没有足够快地禁用帐户,那么读取规则将阻止他们读取任何数据。
当启用用户/密码注册时,API密钥暴露会产生漏洞。有一个开放的API端点,它接受API密钥,并允许任何人创建一个新的用户帐户。然后,他们可以使用这个新帐户登录到受Firebase Auth保护的应用程序,或使用SDK进行user/pass认证并运行查询。
我已经向谷歌报告了这一点,但他们说它正在按照预期工作。
如果您不能禁用用户/密码帐户,您应该执行以下操作:
创建一个云函数来自动禁用新用户onCreate,并创建一个新的DB条目来管理他们的访问。
Ex: MyUsers/ (userId) /Access: 0
exports.addUser = functions.auth.user().onCreate(onAddUser);
exports.deleteUser = functions.auth.user().onDelete(onDeleteUser);
更新规则,只允许访问> 1的用户读取。
监听器函数没有足够快地禁用帐户,那么读取规则将阻止他们读取任何数据。
暴露API密钥并不存在安全风险,但任何人都可以将您的凭据放在他们的站点上。
开放api密钥会导致攻击,可以在firebase上使用大量资源,这肯定会花费你的硬通货。
你总是可以限制你的firebase项目密钥的域名/ IP。
https://console.cloud.google.com/apis/credentials/key
选择您的项目Id和密钥,并限制它为您的Android/iOs/web应用程序。