# 恶意攻击(DDoS/刷单/爬虫)应对指南

本文将针对各类常见攻击场景,给出如何用好微信云托管的安全能力的最佳实践。

请特别注意,以下情况,平台无法为遭受攻击的损失负责:

  • 因为没有正确配置,导致遭受本来可以避免的攻击(小程序/公众号没有用 callcontainer 而用公网访问)。
  • 来自公网的攻击没有办法完全避免但有手段可控。因为没有设置相应告警并及时处理,造成承受范围之外的损失。

# 风险来源

# 微信小程序/公众号

小程序是天然的前后端分离模式,有被攻击风险的是后端接口。

公众号前端是H5,除了后端接口外,H5静态资源也有被刷风险。

传统模式下,后端接口通过公网方式提供(如api.xx.com/xxx),只要公网域名和调用方式泄露/调用方式过于简单,就有可能被恶意攻击者盯上,直接向后端接口发起大量恶意请求,导致 DDoS 攻击/刷单/爬虫爬取重要数据的风险。 通过使用微信云托管独有的 callcontainer 方式,并在「服务设置」中彻底关闭公网访问,可以有效防止被攻击。

# APP/其他平台小程序

主要是后端接口有被攻击和被刷风险。

# web端

后端接口、前端静态资源均有被攻击和被刷风险。

# 安全配置方法

# callcontainer方式避免攻击

  1. 小程序前端代码/公众号H5中,采用微信云托管独有的 callcontainer 方式调用后端接口,彻底取代wx.request。 参考文档: 微信小程序 - 访问云托管服务公众号H5 - 访问云托管服务
  2. 在微信云托管控制台「服务设置」中,关闭「公网访问」开关。
  3. 在「小程序管理后台」-「设置」-「功能设置」-「基础库最低版本设置」中,将值设定为2.23.0 及以上。

以上三条,缺一不可

# 公网访问减小损失

使用 wx.request 或其他方式,通过公网域名请求云托管上的服务,是无法避免被 DDoS 攻击或 DNS 劫持的。一旦被攻击,可能遭遇如下损失:

  • 服务调用量突增,引发服务扩容,产生数倍于正常情况下的CPU/内存用量和费用。
  • 扩容实例数量达到「服务设置」中「实例副本数」的最大值,停止扩容,如果调用量仍在上升,线上服务会宕机。
  • 如果请求的是服务中的静态文件(强烈不建议将静态资源部署在云托管服务中,推荐使用静态资源存储),则在有可能引发扩容导致 CPU 和内存费用暴涨的基础上,额外引发公网流量费用暴涨(静态文件会导致公网请求回包体积大,流量消耗大)。

特别注意,当前微信云托管费用为按天结算,如果遭受攻击导致用量异常,要到第二天早晨结算时才会产生高额费用并可能触发欠费通知。后续将优化为按小时结算。

首先,微信小程序/公众号业务,我们仍然强烈建议你优先考虑将 wx.request 更换为callcontainer,彻底保护业务安全。

非微信小程序/公众号业务,确实需要使用公网域名,在使用前,请明确认识并接受可能产生的被攻击风险。

微信云托管无法阻止公网攻击,但采取以下措施可以一定程度减少损失:

  • 将静态文件放在静态资源存储中,而非直接部署在云托管服务中,并添加防盗链/IP黑白名单/ip访问限频等安全配置。参考文档:静态资源配置
  • 在「服务设置」中将实例副本数最大值调小,设置为你可以接受的最大费用损失。
  • 在「告警设置」中添加告警策略,选择指标「调用次数」+「平均实例个数」。当遭受攻击时,这两个指标的值都会异常增大,可参考服务正常运行时的值,扩大2~5倍设置告警。具体操作参考文档: 告警设置
  • 在腾讯云侧,设置余额告警能力。当账户余额快速减少时,通知提醒。参考文档: 余额预警指引
  • 收到告警后,如果决定停服止损,尽快到「服务设置」中关闭「公网访问」开关,或冻结服务/删除服务,均可避免被继续攻击。

# 场景说明

# 刷单和爬虫

恶意刷单和恶意爬虫,主要是带来数据和业务层面的损失,而非底层资源过度消耗,因为攻击者的出发点也并不是要让线上业务宕机,而是要攫取其他利益。 单从调用量上来看,刷单和爬虫,并不一定会造成调用量的异常增大,而是隐藏在正常的请求之中,难以通过系统的监控指标发现,云托管从平台层面也无法确认你的用户是否遭遇恶意刷单或爬虫。

传统模式下,只能通过业务层面自己沉淀一些安全策略来解决刷单和爬虫问题,比如说识别/封禁恶意来源ip,拦截/过滤伪造微信用户身份的请求,等等,自己实现并不断添加黑白名单。 这样的处理方式是滞后和低效的,基本都是先有教训然后再补上漏洞,用过去的损失转化成不断完善的安全策略,而且依赖人工维护的判断逻辑。

使用微信云托管独有的 callcontainer 方式,能从以下几个方面有效防范刷单和爬虫风险:

  • 只有真实的微信小程序/公众号用户才能对后端接口发起请求,伪造的用户请求无法模拟 callcontainer 的自研加密协议;
  • 共享微信本身安全策略,自动过滤可疑来源和机器号。

以上虽不能绝对保证100%不会被刷单和爬虫,但可以让你的小程序在过滤恶意请求方面的安全性跟微信基本持平,已经尽可能将风险降到了最小。

# DDoS

DDoS的本质是底层资源成本的比拼,攻击者通过短时间内调度大量资源制造高并发的大量请求,超过你的服务承载能力,企图让你的线上业务因负载过大而宕机,或迫使你不断追加资源付出巨额费用。

按照前面所写「安全配置方法」后,因为后端接口彻底不暴露在公网而是走的 callcontainer 专线链路,攻击者无从破解微信的自研加密协议,找不到攻击入口,无法发动 DDos 攻击。

如果服务打开了公网访问开关,那么面对 DDoS 攻击,就不得不做一个艰难的选择:

  • 即便承受数倍的费用,也要保证服务正常运行。选择此项,则在「服务设置」中调大「实例副本数」,用资源与攻击者抗衡,直至对方因攻击成本过高放弃继续攻击。
  • 成本考虑优先于业务持续运行,在有限预算内尽可能抵抗,超出预算则接受对外无法提供服务。选择此项,则在「服务设置」中调小「实例副本数」,超出预算上限则接受停服宕机。
  • 成本高于一切,停服放弃抵抗。选择此项,则在「服务设置」中关闭「公网访问」开关,或彻底删除服务。