当前位置: 首页 > 知识库问答 >
问题:

安全规则中的防火墙速率限制?

吕向阳
2023-03-14

我启动了我的第一个开放存储库项目EphChat,人们很快就开始用大量的请求淹没它。

当前的安全规则如下。

{
    "rules": {
      "rooms": {
        "$RoomId": {
          "connections": {
              ".read": true,
              ".write": "auth.username == newData.child('FBUserId').val()"
          },
          "messages": {
            "$any": {
            ".write": "!newData.exists() || root.child('rooms').child(newData.child('RoomId').val()).child('connections').hasChild(newData.child('FBUserId').val())",
            ".validate": "newData.hasChildren(['RoomId','FBUserId','userName','userId','message']) && newData.child('message').val().length >= 1",
            ".read": "root.child('rooms').child(data.child('RoomId').val()).child('connections').hasChild(data.child('FBUserId').val())"
            }
          },
          "poll": {
            ".write": "auth.username == newData.child('FBUserId').val()",
            ".read": true
          }
        }
      }
    }
}

我想限制写(和读?)整个Rooms对象的数据库,因此每秒只能发出1个请求(例如)。

共有1个答案

龙枫
2023-03-14

诀窍是对用户上次发布消息的时间进行审计。然后可以根据审核值强制发布每条消息的时间:

{
  "rules": {
          // this stores the last message I sent so I can throttle them by timestamp
      "last_message": {
        "$user": {
          // timestamp can't be deleted or I could just recreate it to bypass our throttle
          ".write": "newData.exists() && auth.uid === $user",
          // the new value must be at least 5000 milliseconds after the last (no more than one message every five seconds)
          // the new value must be before now (it will be since `now` is when it reaches the server unless I try to cheat)
          ".validate": "newData.isNumber() && newData.val() === now && (!data.exists() || newData.val() > data.val()+5000)"
        }
      },

      "messages": {
        "$message_id": {
          // message must have a timestamp attribute and a sender attribute
          ".write": "newData.hasChildren(['timestamp', 'sender', 'message'])",
          "sender": {
            ".validate": "newData.val() === auth.uid"
          },
          "timestamp": {
            // in order to write a message, I must first make an entry in timestamp_index
            // additionally, that message must be within 500ms of now, which means I can't
            // just re-use the same one over and over, thus, we've effectively required messages
            // to be 5 seconds apart
            ".validate": "newData.val() >= now - 500 && newData.val() === data.parent().parent().parent().child('last_message/'+auth.uid).val()"
          },
          "message": {
            ".validate": "newData.isString() && newData.val().length < 500" 
          },
          "$other": {
            ".validate": false 
          }
        }
      } 
  }
}

看它在这把小提琴上的作用。这是小提琴的要点:

var fb = new Firebase(URL);
var userId; // log in and store user.uid here

// run our create routine
createRecord(data, function (recordId, timestamp) {
   console.log('created record ' + recordId + ' at time ' + new Date(timestamp));
});

// updates the last_message/ path and returns the current timestamp
function getTimestamp(next) {
    var ref = fb.child('last_message/' + userId);
    ref.set(Firebase.ServerValue.TIMESTAMP, function (err) {
        if (err) { console.error(err); }
        else {
            ref.once('value', function (snap) {
                next(snap.val());
            });
        }
    });
}

function createRecord(data, next) {
    getTimestamp(function (timestamp) {
        // add the new timestamp to the record data
        var data = {
          sender: userId,
          timestamp: timestamp,
          message: 'hello world'
        };

        var ref = fb.child('messages').push(data, function (err) {
            if (err) { console.error(err); }
            else {
               next(ref.name(), timestamp);
            }
        });
    })
}
 类似资料:
  • 我们有一个相当严格的网络分段策略。我正在使用云代工实例来部署应用程序。防火墙规则已经设置为从云代工实例中到达kafka集群。我相信防火墙规则也已经设置为到达动物园管理员实例。我需要实际确认一下。 我的问题似乎是我可以向kafka生成消息,但我的消费者似乎没有取件。它似乎在“轮询”时挂起。 对于我的防火墙规则,是否有一些隐藏的主机或端口需要处理,而不仅仅是标准主机和kafka和zookeeper节点

  • 基本概念 netfilter Linux 内核包含一个强大的网络过滤子系统 netfilter。netfilter 子系统允许内核模块对遍历系统的每个网络数据包进行检查。这表示在任何传入、传出或转发的网络数据包到达用户空间中的组件之前,都可以通过编程方式检查、修改、丢弃或拒绝。netfilter 是 RHEL 7 计算机上构建防火墙的主要构建块。 尽管系统管理员理论上可以编写自己的内核模块以与 n

  • 你好,社区,我正在通过运行以下。我也从Ubuntu18.04.4LTS中得到了类似的结果。 我还提出了一个github问题:https://github.com/azure/ansible/issues/21 我使用Azure CLI是什么意思? ->创建一个新的yml文件。复制下面的脚本。 ->运行下面的剧本。使用此命令 ->以下脚本失败 而且,即使有我可以更改的选择,保存按钮也没有响应。整个防

  • 可以使用高级安全 Windows 防火墙帮助您保护网络上的计算机。高级安全 Windows 防火墙包括有状态的防火墙,通过该防火墙您可以确定允许在计算机和网络之间传输的网络流量。

  • 我不清楚该怎么做。

  • 我有一个服务器写在JavaServerSocket。 我有一个客户端,它位于一个公司防火墙之上,除了公共端口之外,它阻止了所有东西。 我已在SMTP端口(#25)上启动服务器。 有防火墙的用户连接到它,到目前为止一切正常。 然后服务器处理ServerSocket.accept()。据我所知,它在一个随机端口上创建一个套接字(每次端口号都不同)。因为防火墙而失败。 我的问题是-如何制作ServerS