我在云功能中看到了一些非常不寻常的流量,我只能将其归因于攻击(请注意,我使用的是免费的Spark计划(。
收到垃圾邮件的云功能是:
exports.onPlayerSolvedPuzzle = functions.database.ref('/U/{userId}/CP/{puzzleId}/S')
.onCreate((snapshot, context) =>
{
...
正如你所看到的,它被设计为在我的数据库中添加新数据时调用,路径为/U/{userId}/CP/{puzzleId}/S
我的DB规则规定,只有经过身份验证的用户才能用他的ID写入数据,此外,我还检查这个数据条目是否已经存在
{
"rules":
{
"U":
{
"$user_id":
{
".read" : false,
".write": "auth.uid != null && $user_id === auth.uid",
"CP":
{
"$puzzle_id":
{
"S":
{
".validate": "!data.exists()"
},
...
最后,我只启用了"玩游戏"one_answers"游戏中心"身份验证,所以没有匿名帐户或电子邮件/密码帐户可以用来修改我的数据库。
当攻击发生时,我的数据库的最大同时连接数从平均20个跳到100个,云函数调用数从每天1000个或更少跳到每天20000个或更多,这大大占用了我每月的使用配额。
我应该做些什么来保护我尚未完成的云函数调用?
附言:当"onPlayerSolvedPuzzle"执行时,它会写入数据库的另一部分,以增加使用"puzzle_id"解决谜题的人数(如果没有,则创建一个条目(。我已经准备好了代码,看看DB的那部分中是否有与"puzzle_id"相关的条目不应该存在(我知道所有谜题的puzzle_id(。当我运行这段代码时,我看不到任何问题,所以我相信函数的调用路径中没有随机的puzzle_id。
需要知道的几件事:
-
没有办法阻止某人调用您的某个公共函数。您所能做的就是在函数内部编写代码,以确定请求是否有效,是否应该执行。您可能需要考虑在请求中发送用户ID令牌,并使用Admin SDK进行验证。
-
安全规则不适用于使用Admin SDK的后端代码。
-
如果你正在观察滥用流量的情况,你应该直接联系Firebase支持部门报告。