我想对我的 Firebase API 设置一个限制,使其只能在特定域中使用。
事实上,我知道除非有正确的安全规则,否则 Firestore 数据仍然是可读的,但我似乎设法使用 Firestore API,如果我理解正确的话,限制应该可以防止这种情况发生。
因此,我已将浏览器 key 限制设置如下,我单击“保存”按钮并等待了五分钟。
然后我想测试这个限制,所以我打开了 Incognito 开发控制台,复制了与客户端相同的 Firebase 配置,并调用了 Firestore API,如下所示:
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'https://www.gstatic.com/firebasejs/7.14.1/firebase-app.js';
document.head.appendChild(script);
var script2 = document.createElement('script');
script2.type = 'text/javascript';
script2.src = 'https://www.gstatic.com/firebasejs/7.14.1/firebase-firestore.js';
document.head.appendChild(script2);
// Your web app's Firebase configuration
const firebaseConfig = {
apiKey: "exactly_the_same",
authDomain: "exactly_the_same",
databaseURL: "exactly_the_same",
projectId: "exactly_the_same",
storageBucket: "exactly_the_same",
messagingSenderId: "exactly_the_same",
appId: "exactly_the_same"
};
// Initialize Firebase
firebase.initializeApp(firebaseConfig);
const db = firebase.firestore();
db.collection('events').get().then((snapshot) => {
snapshot.docs.forEach(doc => {
console.log(doc)
})
})
我得到的响应是这样的,进一步查看这些元素,它们包含 Firestore 数据。
因此,这个限制根本不起作用,那么我做错了什么?
更新
事实证明,HTTP 引用限制仅适用于非 Firestore API。我不确定为什么会这样,所以我欢迎任何人对此发表看法。 @willnode 是正确的,您需要两个 URL 域列表(包括一个带有通配符的列表)才能将整个域列入白名单。当我使用 Auth API(使用匿名登录)对其进行测试时,我发现它有效。
关于使用 HTTP Referrer 限制 API key 是否足够安全的问题是另一个问题。
另一个更新
出于某种原因,我们不得不等待更长时间,以便 Firestore API 也能处理 Referrer 限制。现在一切正常。
最佳答案
仅基于 HTTP 引荐来源网址是不安全的,因为它可能被欺骗。如果有人可以从您的 Web 应用程序代码中提取您的 Firebase 配置,那么欺骗域对他们来说花费的工作量最少,这就是身份验证对于删除垃圾邮件用户很重要的原因。如果用户未经过验证,则只需提供您应用的最低限度功能,直到他们验证是他们本人。
用于限制相同域的请求 App Check是我们的首选建议,它可以保护您的后端资源免遭滥用。 App Check 是一个额外的安全层,它通过证明传入流量来自您的应用程序并阻止没有有效凭据的流量来保护对您的服务的访问。对于网络应用,App Check 使用 reCAPTCHA v3 来减少滥用的可能性。
关于App Check的更多信息,你也可以查看这个guide .
我仍然建议您实现 Authentication和 Firebase Security Rules .如果您不想要求您的用户输入凭据,您可以使用 Firebase Anonymous Authentication为他们生成一个唯一的 UID。然后,您可以在安全规则中检查该 UID,并仍然确保每个用户/设备仅访问他们获得授权的数据。
关于firebase - 对 Firebase API key 设置 HTTP referer 限制没有任何区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70175022/