# 恶意攻击（DDoS/刷单/爬虫）应对指南

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

请特别注意，以下情况，平台无法为遭受攻击的损失负责：
- 因为没有正确配置，导致遭受本来可以避免的攻击（小程序/公众号没有用 callcontainer 而用公网访问）。
- 来自公网的攻击没有办法完全避免但有手段可控。因为没有设置相应告警并及时处理，造成承受范围之外的损失。

## 风险来源

### 微信小程序/公众号
小程序是天然的前后端分离模式，有被攻击风险的是后端接口。

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

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

### APP/其他平台小程序

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

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

## 安全配置方法

### callcontainer 方式避免攻击
1. 小程序前端代码/公众号 H5 中，采用微信云托管独有的 callcontainer 方式调用后端接口，彻底取代 wx.request。 参考文档: [微信小程序 - 访问云托管服务](/miniprogram/dev/wxcloudservice/wxcloudrun/src/development/call/mini) 和 [公众号 H5 - 访问云托管服务](/miniprogram/dev/wxcloudservice/wxcloudrun/src/development/call/h5)
2. 在微信云托管控制台「服务设置」中，关闭「公网访问」开关。
3. 在「小程序管理后台」-「设置」-「功能设置」-「基础库最低版本设置」中，将值设定为 2.23.0 及以上。

**以上三条，缺一不可**。

### 公网访问减小损失

使用 wx.request 或其他方式，通过公网域名请求云托管上的服务，是无法避免被 DDoS 攻击或 DNS 劫持的。一旦被攻击，可能遭遇如下损失：
- 服务调用量突增，引发服务扩容，产生数倍于正常情况下的 CPU/内存用量和费用。
- 扩容实例数量达到「服务设置」中「实例副本数」的最大值，停止扩容，如果调用量仍在上升，线上服务会宕机。
- 如果请求的是服务中的静态文件（强烈不建议将静态资源部署在云托管服务中，推荐使用静态资源存储），则在有可能引发扩容导致 CPU 和内存费用暴涨的基础上，额外引发公网流量费用暴涨（静态文件会导致公网请求回包体积大，流量消耗大）。

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

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

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

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

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

## 场景说明
### 刷单和爬虫

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

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

使用微信云托管独有的 callcontainer 方式，能从以下几个方面有效防范刷单和爬虫风险：
- 只有真实的微信小程序/公众号用户才能对后端接口发起请求，伪造的用户请求无法模拟 callcontainer 的自研加密协议；
- 共享微信本身安全策略，自动过滤可疑来源和机器号。

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

### DDoS

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

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

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