小程序安全防护

最近更新时间:2025-11-24 09:36:21

我的收藏

功能简介

Web 应用防火墙推出小程序安全防护方案,提供包括小程序安全防护、数据私有协议加密、DNS 防劫持、分布式就近防护、网络应用防护等多种能力,帮助用户提高业务数据及接口安全、抵御外部恶意流量以及提升业务访问质量。
说明:
1. 产品试用说明:未试用过小程序安全防护功能的用户,支持免费领取7-15天体验权益。
2. 接入说明:自动接入仅支持有体验版的标准小程序,无体验版小程序、H5小程序需采用手动接入。
1. 登录 Web 应用防火墙控制台,在左侧导航栏中,选择小程序安全防护
2. 在小程序安全防护页面,单击小程序接入切换到小程序接入界面,进行小程序接入或者升级购买。
若当前 WAF 实例尚未保有小程序安全防护增值能力,可以单击新购申请小程序安全防护增值能力,跳转至购买页按需购买。
若当前 WAF 实例已保有小程序安全防护增值能力,本页面支持小程序接入以及接入列表管理。
3. 小程序接入支持自动接入和手工接入两种不同的接入方式。

4.小程序接入列表管理。
接入完成后,可以查看小程序卡片在接入防护后的请求次数,以及防护拦截的请求数,了解访问趋势及威胁防护趋势。


自动接入

适合于有体验版的标准小程序接入,只需授权小程序接入管理能力,无需修改代码、无需重新发版,即可发布至体验版,验证完成后,支持一键发布至线上版本。

步骤1:授权接入,选择相应的小程序以完成授权

1. 小程序安全防护 > 小程序接入页面,选择自动接入,单击开始接入
2. 在一键授权页面,选择需接入防护的小程序 ID。在新打开的公众号授权平台页面,使用管理员微信扫码授权 WAF 自动完成小程序接入,完成授权。本次授权仅包含开通小程序安全防护能力,不涉及其他权限。
3. 授权完成后,将自动刷新至 Web 应用防火墙控制台并唤起接入侧边栏。
4. 在授权接入页面,选择当前需要接入的小程序,单击确认接入,进入下一步,进入体验测试页面。


步骤2:完善小程序源站接入 WAF 后,扫码测试验证

在体验测试页面,管理小程序源站域名和端口,将全部接入 WAF 后,展示小程序体验二维码,支持用户扫描验证。
若域名未全部接入 WAF,提供接入状态提示,均完成接入后才会展示体验码。
若域名均完成接入 WAF,自动展示体验版二维码。客户扫码进行小程序体验测试,且检验接入业务无异常后,单击下一步进行发布环节。 默认将小程序体验版请求接入微信私有链路,完全不影响线上业务流量。


步骤3:确认发布,开启安全防护

1. 在发布管理页面,确认内容无误后,单击确定发布,将小程序防护能力应用到线上发布版本。

2. 发布后,默认将小程序线上请求接入微信私有链路,受小程序安全防护能力保护。

发布管理

自动接入成功后,在 小程序安全防护 > 小程序接入页面,支持对接入的小程序取消发布,以及修正后重新发布管理能力。
发布回滚:完成发布后,支持单击小程序卡片中的取消发布进入发布管理页面,单击取消发布,经过二次确认后,自动将线上版小程序请求切换至原业务公网链路,不经过小程序安全防护功能。

重新发布:取消发布后,单击小程序卡片中的编辑继续完成小程序接入,即可唤起发布管理页面,重新发布后,将线上版小程序请求重新接入小程序安全防护功能。


手动接入

适用于各种小程序接入,只需简单修改代码、测试并验证发布即可开启小程序安全防护能力。

步骤1:接入配置

1. 小程序安全防护 > 小程序接入页面,选择手动接入,单击开始接入
2. 在新建小程序接入侧边栏中,填写完对应配置内容,即可单击保存配置,进入下一步

参数名称
说明
节点名称
自定义节点名称。
小程序 ID
小程序唯一 ID,可以扫码登录 微信公众平台获取。
流量来源
根据实际情况选择流量来源。
小程序接入
Web SDK 接入
APP SDK 接入
域名
域名
选择已接入的小程序域名。
协议端口
选择协议端口。
高级设置
回包 Header 头配置
key 全小写
key 首字母大写
备注
备注,200个字符以内。

步骤2:客户端配置

微信开发者工具 中,对小程序项目的代码进行适配。

小程序接入

1. 环境加载。
在项目配置文件 app.json 中添加如下配置,以获得更好的兼容性,建议在发布前通过预览或者体验版在真机上测试小程序功能是否正常。
{
"cloud": true,
"cloudVersion": "alpha"
}
2. 域名配置。
2.1 在客户端配置页面,复制并获取您的网关接入域名。

2.2 前往 微信公众平台,在开发管理中修改服务器域名,将网关的接入域名新增到小程序合法域名列表中。

3. 初始化小程序网关。
完成域名配置后,测试并验证更改自己的网关 ID 信息。
// app.js
App({
async onLaunch() {
const gateway = wx.cloud.services.Gateway({
// 接入域名:即在网关接入层生成的域名,请复制“域名配置”中网关的接入域名。
domain: 'a1dxxxx4a-wxxxxx1259xxxx5086.sh.wxgateway.com',
});
// 赋值到 cloud 对象上,方便后续调用
wx.cloud.gateway = gateway;
}
})
4. 调用网关。
将项目中的 wx.request 调用更改为 wx.cloud.gateway.call,以确保流量通过微信网关安全链路。
除了 path 参数外,wx.cloud.gateway.call 的调用形式与 wx.request 基本相同。
path 参数不应包含域名和端口信息,如果 path 中包含了域名和端口,会忽略处理。
wx.cloud.gateway.call({
// 请填写完整的请求路径(包括协议头和 host 部分,如 https://api.example.com/path?query=xxx),中文需要encodeURIComponent函数转译
path: `https://api.example.com/?word=${encodeURIComponent('微信网关访问')}`,
// 请求方法
method: 'GET',
// 客户端发起请求时,可以自定义请求头中的header字段,如下:
header: {
// 'my-header': 'xxxxx'
// ! 重要:多域名场景下,需要携带这个 Header,以启用多域名支持能力
'X-WX-HTTP-MODE': 'REROUTE',
}
// 其余参数与 wx.request 相同
}).then(result => {
console.log('微信网关访问结果: ', result)
})
调用成功示例:


WAF 检测到攻击,拦截示例:



Web SDK 接入

原生接入
1. 环境加载。
在 HTML 中,引入小程序安全防护网关的 Web SDK。
<script src="https://res8.wxqcloud.qq.com.cn/cloud-sdk/v3.0.19/cloud.js" importance="VeryHigh"></script>
2. 域名配置。
2.1 在客户端配置页面,复制并获取您的网关接入域名。

2.2 前往 微信公众平台,在开发管理中修改服务器域名,将网关的接入域名新增到小程序合法域名列表中。

3. 初始化网关对象和实例。
测试验证更改自己的小程序安全防护网关 ID 信息,小程序 appid,网关接入节点域名信息。
const c1 = new cloud.Cloud({
identityless: true,
resourceAppid: 'wxcb05cd6fc6f5f8bd', // appid,填入接入的小程序 appid
config: {
customDomain: 'https://a1dxxxx4a-wxxxxx1259xxxx5086.sh.wxgateway.com' // 网关接入节点域名,主要需要包括协议头
}
})
c1.init() // 初始化实例
const gateway = c1.services.Gateway({ domain: 'a1dxxxx4a-wxxxxx1259xxxx5086.sh.wxgateway.com' }) // 网关接入节点域名,注意不包含协议头
4. 调用网关。
请求小程序安全防护网关地址,需要加密的请求的方法进行替换。
const gateway = c1.services.Gateway({ domain: 'a1dxxxx4a-wxxxxx1259xxxx508.sh.wxgateway.com' }); // 小程序安全防护的接入节点域名,不包含协议头
gateway
.call({
// 请填写完整的请求路径(包括协议头和 host 部分,如 https://api.example.com/path?query=xxx),中文需要encodeURIComponent函数转译
path: `https://api.example.com/?word=${encodeURIComponent('微信网关访问')}`,
// 请求方法
method: 'GET',
// 发起请求时,可以自定义请求头中的header字段,如下:
header: {
// 'my-header': 'xxxxx'
// ! 重要:多域名场景下,需要携带这个 Header,以启用多域名支持能力
'X-WX-HTTP-MODE': 'REROUTE',
}
})
.then(res => {
console.log(res); // 网关返回结果
});
Axios 接入
1. 环境加载。
在 HTML 中,引入小程序安全防护网关的 Web SDK。
<script src="https://res8.wxqcloud.qq.com.cn/cloud-sdk/v3.0.19/cloud.js" importance="VeryHigh"></script>
2. 域名配置。
2.1 在客户端配置页面,复制并获取您的网关接入域名。

2.2 前往 微信公众平台,在开发管理中修改服务器域名,将网关的接入域名新增到小程序合法域名列表中。

3. 初始化网关对象和实例。
新建一个 wxadapter.js,文件内容如下,修改其中的 GATEWAY_DOMAIN 字段为接入的网关域名(详见域名配置),以及接入小程序 IDresourceAppid
import { AxiosHeaders } from 'axios';
import settle from 'axios/unsafe/core/settle';
import fetchAdapter from 'axios/unsafe/adapters/fetch';
import resolveConfig from 'axios/unsafe/helpers/resolveConfig.js';
// 网关接入节点域名
const GATEWAY_DOMAIN = 'a1dxxxx4a-wxxxxx1259xxxx5086.sh.wxgateway.com'
const c1 = new window.cloud.Cloud({
identityless: true,
resourceAppid: 'wxcb05cd6fc6f5f8bd', // appid,填入接入的小程序 appid
config: {
customDomain: `https://${GATEWAY_DOMAIN}`,
},
});
c1.init(); // 初始化实例
const gateway = c1.services.Gateway({
domain: GATEWAY_DOMAIN,
}); // 网关接入节点域名,不包含协议头
const wxadapter = (config) =>
new Promise((resolve, reject) => {
let { url, ...resolved } = resolveConfig(config)
gateway
.call({
...resolved,
path: url,
header: {
'X-WX-HTTP-MODE': 'REROUTE',
...config.headers,
},
})
.then((result) => {
const headers = new AxiosHeaders(result.header);
const response = {
config,
data: result.data,
headers,
status: result.statusCode,
statusText: result.errMsg ?? 'OK',
cookies: result.cookies,
};
settle(resolve, reject, response);
})
.catch(
// 降级为普通 fetch 请求
(error) => {
console.log(
error,
'error when using wx gateway, using fetch adapter to fallback'
);
return fetchAdapter(config).then((result) => {
const response = result;
settle(resolve, reject, response);
}).catch(reject);
}
);
});
export default wxadapter;
4. 引入 adapter
在应用入口 js 处引入上面的 adapter
import axios from 'axios';
import wxadapter from './wxadapter';
// 应用到默认的 axios 实例
axios.defaults.adapter = wxadapter;
const fallback = false; // 配置是否降级 false 为不降级,失败走降级重试链路,true 为默认降级
// 也可以使用独立的 axios 实例
if (!fallback) {
axios.create({
// ...config
adapter: wxadapter,
});
} else {
axios.create({
// ...config
});
}
5. 测试请求。
测试请求是否正常,以及请求是否通过加密即可。
说明:
注意 2.0.4 的 SDK 不允许打开 DevTools 调试工具,否则将被拦截。


APP SDK 接入

IOS 系统SDK 接入
1. 获取 SDK 和网关域名。
SDK:前往客户端配置页面,下载 SDK iOS 资源包。SDK包含:WXCloud.h(头文件),libWXCloudCore.a(静态库),WXCloudSample(示例工程)。

网关域名:您的接入域名即为网关域名。
2. 添加头文件、静态库和依赖。
导入示例工程,添加头文件、静态库,添加底层依赖系统动态库 libz。

3. 调用网关。
其中,key,secret 为通过工单申请具体获得当前接入小程序的专属值,sGwDomain 为步骤 1 中获取的网关域名。
#import "WXCloud.h"
// 初始化网关(key, secret)
std::string sAppKey = "";
std::string sAppSecret = "";
std::string sGwDomain = "a1dxxxx4a-wxxxxx1259xxxx5086.sh.wxgateway.com";
wxcloud::WXCloud &oInstance = wxcloud::WXCloud::getSharedInstance(sAppKey, sAppSecret, sGwDomain);
// 调用
wxcloud::RequestType requestType = wxcloud::RequestType::SYNC; // 同步请求
wxcloud::HttpMethod httpMethod = wxcloud::HttpMethod::POST; // http method
std::string sPath = "/6ea7d45b-ec80-4cb3-b2a5-f7bed1b48e7a"; // http path,不带业务域名
wxcloud::header_type mapHeaders; // http header
mapHeaders["HOST"] = "webhook.site"; // 业务域名
mapHeaders["x-wx-route-tag"] = "6cb24a7e69a3f58147741a736be69e0b"; // 业务域名md5
std::string sBody = "hello world."; // http body
oInstance.callContainer(requestType, httpMethod, sPath, mapHeaders, sBody, [](long ret, long http_code, std::map<std::string, std::string>headers, std::string body){
// 先判断ret: 0 成功,非0失败;再判断http_code
// ret == 0 && http_code == 200 表示调用成功
if(ret == 0 && http_code == 200) {
} else {
// ret = [1-98] 详见 https://curl.se/libcurl/c/libcurl-errors.html
}
});
Android 接入
1. 获取 SDK。
前往客户端配置页面,下载 SDK Android 资源包。SDK包含:libWXCloudCore.so(动态库:arm64-v8a和armeabi-v7a两种架构),WXCloudCore.javaWXCloudContainerResp.java(JNI类),WXCloudDemo(示例工程)。

2. 域名配置。
2.1 在客户端配置页面,复制并获取您的网关接入域名。

2.2 前往 微信公众平台,在开发管理中修改服务器域名,将网关的接入域名新增到小程序合法域名列表中。

3. 添加头文件、静态库和依赖。
SDK 底层依赖系统动态库 -lz -llog。
3.1 导入实例工程,添加libWXCloudCore.so,并在build.gradle 指定动态库目录libz。

android {
...
sourceSets{
main{
jniLibs.srcDirs = ['libs']
}
}
...
}
3.2 新建 com.tencent.wxcloud 包,并添加 WXCloudCore.javaWXCloudContainerResp.java

4. 调用网关。
其中,key,secret 为通过工单申请具体获得当前接入小程序的专属值,sGwDomain 为步骤 2 中的配置的网关域名。
// 初始化网关(key,secret,网关域名)
String sAppKey = "";
String sAppSecret = "";
String sGwDomain = "a1dxxxx4a-wxxxxx1259xxxx5086.sh.wxgateway.com";
this.wxCloudCore = new WXCloudCore(sAppKey, sAppSecret, sGwDomain);

// 调用
String sRequestType = "SYNC"; // 同步请求
String sHttpMethod = "POST"; // http method
String path = "/6ea7d45b-ec80-4cb3-b2a5-f7bed1b48e7a"; // http path,不带业务域名
HashMap<String, String> header = new HashMap<>(); // http header
header.put("HOST", "webhook.site"); // 业务域名
header.put("x-wx-route-tag", "6cb24a7e69a3f58147741a736be69e0b"); // 业务域名md5
String sBody = "hello world."; // http body
byte [] arrBody = sBody.getBytes(); // 二进制

WXCloudContainerResp oResp = this.wxCloudCore.callContainer(sRequestType, sHttpMethod, path, header, arrBody);
System.out.printf("wxcloud resp.ret=%d, resp.http_code=%d, resp.body=%s, resp.headers=%s
", oResp.respRet, oResp.respHttpCode, String.valueOf(oResp.respBody), oResp.respHeaders);

步骤3:测试验证与发布确认

1. 小程序客户端代码适配完成之后,按照小程序发布标准,进行测试及其发布。
2. 小程序新版本正式发布之后,在 小程序安全防护 > 小程序接入页面的接入配置第三步中同步修改状态为流量接入安全网关已验证,已发布,单击完成,即整个接入过程完成。