代码之家  ›  专栏  ›  技术社区  ›  Sheshank S.

如何在javascript代码中更改数据库值,但不允许用户在javascript控制台中更改(或访问)数据库值?

  •  1
  • Sheshank S.  · 技术社区  · 6 年前

    好的,我正在创建一个web应用程序。

    web应用程序基本上是一个游戏,在这个游戏中你有很多分数。通过正确回答加法题,你可以得到更多的分数。

    我正在使用firebase实时数据库来保存用户的分数。这是每当用户正确回答问题时我运行的代码:( document.getElementById("score").innerText 是当前分数)

    var user = firebase.auth().currentUser;
    firebase.database().ref('users/' + user.uid).set({
       score: parseInt(document.getElementById("score").innerText) + 2,
    }).catch(function(error) {
       console.log(error);
    });
    

    所以效果不错。但是,我发现,用户可以获取该代码,并将其放在控制台中,从而获得无限点数。

    那我该怎么解决呢?如果需要更改,这是我当前的数据库规则:

    {
      "rules": {
        ".read": true,
        ".write": true
      }
    }
    

    我更普遍的问题是

    如何在javascript代码中更改数据库值,但不允许用户在javascript控制台中更改(或访问)数据库值?

    我调查过 https://firebase.google.com/docs/database/security/securing-data 找不到任何有用的东西。我想我需要更改数据库规则中的一些内容。

    更新:到目前为止建议的最佳解决方案是在firebase中使用云函数。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Doug Stevenson    6 年前

    您必须将处理数据库的逻辑放在不能被篡改的后端代码中。如果您已经在使用firebase,那么云功能就是典型的选择。

    在I/O 2017 I gave a talk 关于编写一个基于回合的游戏,通过把所有的核心逻辑放在后端与云功能的作弊免疫。细节有点过时,但原则不变。