Firebase云功能:如何处理连续请求

Firebase云功能:如何处理连续请求,firebase,google-cloud-functions,Firebase,Google Cloud Functions,在使用Firebase(本例中为Firebase云功能)时,我们必须为每个字节的带宽付费 所以,我想知道我们如何处理这样一种情况:某人不知何故发现了我们的端点,然后故意(通过脚本或工具)继续请求 我在网上做了一些搜索,但没有看到任何有用的东西。 除了但不是真正有用。因为您没有指定哪种类型的请求,我假设您指的是firebase云函数上的http(s)-触发器 您可以设置多个限制器来“减少”请求所消耗的带宽。我会写一些我想到的 1)限制请求的类型 如果您只需要GET,比如说您不需要PUT,那么您可以

在使用Firebase(本例中为Firebase云功能)时,我们必须为每个字节的带宽付费

所以,我想知道我们如何处理这样一种情况:某人不知何故发现了我们的端点,然后故意(通过脚本或工具)继续请求

我在网上做了一些搜索,但没有看到任何有用的东西。
除了但不是真正有用。

因为您没有指定哪种类型的请求,我假设您指的是firebase云函数上的http(s)-触发器

您可以设置多个限制器来“减少”请求所消耗的带宽。我会写一些我想到的

1)限制请求的类型

如果您只需要
GET
,比如说您不需要
PUT
,那么您可以先返回403,然后再进一步使用云函数

if (req.method === 'PUT') { res.status(403).send('Forbidden!'); }
2)如果可以,请进行身份验证

并且只允许授权用户使用您的https端点。您可以通过向验证令牌来实现这一点

3)检查原产地

在进一步使用云函数之前,您可以尝试检查请求的来源。如果我没记错的话,云功能允许您完全访问HTTP请求/响应对象,以便您可以设置适当的CORS头并响应飞行前选项请求

实验想法1

你可以假设把你的函数放在一个继电器后面,然后触发它们。这或多或少会破坏云功能的可伸缩性,但如果某种形式的DoS比可伸缩性更让你担心,那么你可以尝试创建一个应用引擎中继,将其置于负载均衡器/防火墙之后,并在该层处理安全问题

实验想法2

您可以尝试使用DNS级别的攻击预防解决方案来解决您的问题,方法是在两者之间放置类似cloudflare的东西。使用CNAME,并将URL映射到云功能。这可以假设地吸收影响。像这样:

*function1.mydomain.com/*
->
https://us-central1-etc-etc-etc.cloudfunctions.net/function1/$2

现在如果你去

http://function1.mydomain.com/?something=awesome

您甚至可以将URL参数传递给函数。这是我在夏天读到的一个战术,当时我需要类似的东西

最后


为了使SOF上的问题更紧密地联系在一起,并帮助每个人找到答案,我发现另一个本质上类似的问题。链接到这里,以便其他人也可以找到它

这个问题有一个解决方案,您可以在其中验证https端点

只有在HTTP请求的授权标头或会话cookie中作为承载令牌传递有效Firebase ID令牌的用户才有权使用该功能

if (req.method === 'PUT') { res.status(403).send('Forbidden!'); }
使用ExpressJs中间件检查ID令牌,该中间件也会在Express请求对象中传递解码的ID令牌


检查firebase的示例代码。

在不受支持的方法上返回403或空正文对您没有多大帮助。是的,您将有更少的带宽浪费,但firebase仍将为您的请求付费,攻击者可能只发送数百万个请求,您仍将赔钱

此外,身份验证并不能解决此问题。首先,任何身份验证过程(创建令牌、验证/验证令牌)都是昂贵的,firebase也考虑到了这一点,并将根据函数返回响应所需的时间向您收费。您不能使用auth来阻止连续请求

另外,聪明的攻击者不会只选择返回403的req。是什么阻止攻击者攻击登录端点数百万次??如果他提供了正确的凭证(如果他聪明的话,他会这么做),那么每次返回令牌都会浪费带宽,而且如果你重新生成令牌,那么每次请求都会浪费时间,这会进一步损害你的账单

这里的想法是完全阻止此攻击者(在转到api函数之前)。
我要做的是使用cloudflare代理我的端点,在我的api中,我会定义每个ip的最大请求限制和一个时间帧,将每个请求ip保存在db上,并在每个请求上检查ip是否超过给定时间帧的限制,如果是,您只需使用cloudflare api在防火墙上阻止该ip

提示: 可以为不同的请求定制每个ip的最大请求限制和时间帧

例如:

  • ip可以在1小时内击中403 10次
  • ip可以在20分钟内成功登录5次
  • ip可以在1小时内命中登录5次失败

  • 在函数中放入访问控制逻辑是Firebase的标准做法,但仍然必须调用函数才能访问该逻辑

    如果您不希望除了经过身份验证的用户之外的任何功能启动,您可以利用以下事实:每个Firebase项目也是一个Google云项目,GCP允许“私有”功能。

    您可以在函数之外设置项目范围或每个函数的权限,以便只有经过身份验证的用户才能触发函数,即使他们试图攻击端点


    这是关于和的文档。请注意,在撰写本文时,我认为使用此方法需要用户使用Google帐户进行身份验证

    这很容易验证,我知道如何验证,但在很多情况下,我们需要提供一个公共端点,这样任何人都可以使用。关键是如何对付那些想攻击我们的人。谢谢你的回答。除了云费,我都做了,谢谢。所以,在最后,我们需要小心计算每一个拜拜的成本,请求保护我们自己ạngHoánggla