Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向公众公开Firebase apiKey安全吗?_Javascript_Firebase - Fatal编程技术网

Javascript 向公众公开Firebase apiKey安全吗?

Javascript 向公众公开Firebase apiKey安全吗?,javascript,firebase,Javascript,Firebase,我应该将给定的apiKey放入Html中以初始化Firebase的状态: //TODO:替换为项目的自定义代码段 //初始化Firebase 变量配置={ apiKey:“”, 身份验证域:“”, 数据库URL:“”, storageBucket:“” }; firebase.initializeApp(配置); 通过这样做,apiKey将向每个访问者公开 该密钥的用途是什么?它是否真的是公开的?此配置片段中的apiKey仅用于识别您在Google服务器上的Firebase项目。这不是一个安全

我应该将给定的
apiKey
放入Html中以初始化Firebase的状态:

//TODO:替换为项目的自定义代码段
//初始化Firebase
变量配置={
apiKey:“”,
身份验证域:“”,
数据库URL:“”,
storageBucket:“”
};
firebase.initializeApp(配置);
通过这样做,
apiKey
将向每个访问者公开


该密钥的用途是什么?它是否真的是公开的

此配置片段中的apiKey仅用于识别您在Google服务器上的Firebase项目。这不是一个安全风险的人知道它。事实上,他们有必要了解这一点,以便与您的Firebase项目进行交互。同样的配置数据也包含在每个使用Firebase作为后端的iOS和Android应用程序中

从这个意义上讲,它与数据库URL非常相似,后者在同一个代码段中标识与项目关联的后端数据库:
https://,包括使用Firebase的服务器端安全规则,以确保只有授权用户才能访问后端服务

如果您想了解如何确保对Firebase后端服务的所有数据访问获得授权,请阅读上的文档。这些规则控制对文件存储和数据库的访问,并在Firebase服务器上强制执行。因此,无论是您的代码,还是其他人的代码使用您的配置数据,它都只能执行安全规则允许它执行的操作

有关Firebase将这些值用于什么以及可以为其中哪些设置配额的另一种解释,请参阅上的Firebase文档


如果您想减少将此配置数据提交到版本控制的风险,请考虑使用。虽然这些键仍将以相同的格式出现在浏览器中,但它们将不再硬编码到您的代码中


更新(2021年5月):多亏了名为的新功能,现在实际上可以将Firebase项目中后端服务的访问限制为仅来自特定项目中注册的iOS、Android和Web应用程序的访问

您通常希望将其与上面描述的基于用户身份验证的安全性结合起来,这样您就可以对使用您的应用程序的滥用用户提供另一个防护


通过将应用程序检查与安全规则相结合,您既可以广泛防止滥用,又可以控制每个用户可以访问哪些数据,同时仍然允许从客户端应用程序代码直接访问数据库。

以prufrofro和Frank van Puffelen的答案为基础,我把这个设置放在一起,它不会阻止刮取,但会使API密钥的使用稍微困难一些

警告:要获取数据,即使使用此方法,您也可以在Chrome中打开JS控制台并键入:

firebase.database().ref("/get/all/the/data").once("value", function (data) {
    console.log(data.val());
});
只有数据库安全规则才能保护您的数据。

尽管如此,我还是将生产API密钥的使用限制为我的域名,如下所示:

".read": "auth != null && root.child('/userdata/'+auth.uid+'/userRole').exists()",
".write": "auth != null && root.child('/userdata/'+auth.uid+'/userRole').exists()"
"userdata": {
  "$userId": {
    ".write": "$userId === auth.uid || root.child('/userdata/'+auth.uid+'/userRole').val() === 'superadmin'",
   ...
  • 选择您的Firebase项目
  • 证书
  • 在API键下,选择浏览器键。它应该是这样的:“浏览器键(由谷歌服务自动创建)”
  • 在“接受这些用户的请求”中 HTTP referers(web站点)”,添加应用程序的URL(例如:
    projectname.firebaseapp.com/*
  • 现在,该应用程序将只在这个特定的域名上工作。因此,我创建了另一个API密钥,该密钥对于本地主机开发是私有的

  • 单击创建凭据>API密钥
  • 默认情况下,如Emmanuel Campos所述


    为了确保我不会错误地发布错误的API密钥,我使用以下方法之一在生产中自动使用更严格的API密钥

    创建React应用程序的设置

    /env.development
    中:

    REACT_APP_API_KEY=###dev-key###
    
    /env.production
    中:

    REACT_APP_API_KEY=###public-key###
    
    /src/index.js中

    const firebaseConfig = {
      apiKey: process.env.REACT_APP_API_KEY,
      // ... 
    };
    

    我不相信向客户端公开安全/配置密钥。我不会说它是安全的,不是因为有人可以从第一天就窃取所有的私人信息,因为有人可以提出过多的请求,耗尽你的配额,让你欠谷歌一大笔钱

    你需要考虑很多概念,比如限制人们不去他们不应该去的地方,拒绝服务攻击等等

    我更希望客户机先访问您的web服务器,在那里您可以在客户机和服务器之间或服务器和firebase之间放置任何第一手的防火墙、验证码、cloudflare、自定义安全性,这样您就可以开始了。至少在可疑活动到达firebase之前,您可以先停止它。你会有更多的灵活性


    对于使用基于客户端的配置进行内部使用,我只看到一个好的使用场景。例如,您拥有内部域,并且您非常确定外部人员无法访问该域,因此您可以设置诸如browser->firebase type之类的环境。

    启用用户/密码注册时,API密钥暴露会创建漏洞。有一个开放的API端点,它接受API密钥并允许任何人创建新的用户帐户。然后,他们可以使用此新帐户登录到受Firebase身份验证保护的应用程序,或使用SDK通过用户/密码进行身份验证并运行查询

    我已经向谷歌报告了这一点,但他们说它正在按预期工作

    如果无法禁用用户/密码帐户,则应执行以下操作: 创建一个云函数,在创建时自动禁用新用户,并创建一个新的DB条目来管理他们的访问

    例如:MyUsers/{userId}/Access:0

    exports.addUser = functions.auth.user().onCreate(onAddUser);
    exports.deleteUser = functions.auth.user().onDelete(onDeleteUser);
    
    更新规则以仅允许access>1的用户读取

    如果侦听器功能没有足够快地禁用帐户,则读取规则将阻止它们读取任何数据。

    I believ
    "userdata": {
      "$userId": {
        ".write": "$userId === auth.uid || root.child('/userdata/'+auth.uid+'/userRole').val() === 'superadmin'",
       ...