在 Firebase API 键上设置 HTTP 引用限制没有任何区别

Setting HTTP referer restriction on Firebase API key does not make a difference

我想对我的 Firebase API 设置一个限制,使其只能从特定域使用。

事实上,我知道除非有正确的安全规则,否则 Firestore 数据仍然是可读的,但我似乎设法使用 Firestore API 并且限制应该可以防止这种情况,如果我明白的话正确。

所以,我将浏览器密钥限制设置如下,我点击了保存按钮并等待了五分钟。

然后我想测试这个限制,所以我打开了 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 APIs。我不确定为什么会这样,所以我欢迎任何人对此发表看法。 @willnode 是正确的,您需要 two URL 域列表(包括一个带有通配符的域列表)才能将整个域列入白名单。当我使用 Auth API(使用匿名登录)对其进行测试时,我发现它有效。

关于使用 HTTP Referrer 限制 API 密钥是否足够安全的问题是另一个问题。

另一个更新

出于某种原因,我们不得不等待更长时间,以便 Firestore API 也可以使用 Referrer 限制。现在一切正常。

阅读官方 documentation,您至少需要提供两个限制,以允许在单个子域或裸域中允许任何 URL(您在屏幕截图中只提供一个)。以下是摘录:

1. You must set at least two restrictions to allow an entire domain.

2. Set a restriction for the domain, without the trailing slash. For example:
   + https://www.example.com
   + http://sub.example.com
   + http://example.com
3. Set a second restriction for the domain that includes a wildcard for the path. For example:
   + https://www.example.com/*
   + http://sub.example.com/*
   + http://example.com/*

If your domain allows both HTTP and HTTPS you must add additional restrictions separately.

仅基于 HTTP 引荐来源网址是不安全的,因为它可能被欺骗。如果有人可以从您的 Web 应用程序代码中提取您的 Firebase 配置,那么欺骗域对他们来说花费的工作量最少,这就是身份验证对于删除垃圾邮件用户很重要的原因。如果用户未经过验证,则只需提供您应用的最低限度功能,直到他们验证是他们本人。

对于限制为相同域的请求 App Check 是我们的首选建议,它可以保护您的后端资源免受滥用。 App Check 是一个额外的安全层,它通过证明传入流量来自您的应用程序并阻止没有有效凭据的流量来保护对您的服务的访问。对于网络应用程序,App Check 使用 reCAPTCHA v3 来减少滥用的机会。

关于App Check的更多信息,您也可以查看这个guide

我仍然建议您实施 Authentication and Firebase Security Rules. If you don't want to require that your users enter credentials, you can use Firebase Anonymous Authentication 来为他们生成唯一的 UID。然后您可以在您的安全规则中检查该 UID,并仍然确保每个 user/device 只访问他们被授权的数据。