# 安全防护

# 安全防护介绍

为解决小程序业务在各种应用场景中遇到的恶意注册、虚假刷单、群控养号、营销作弊等黑灰产风险和安全问题,微信安全网关推出安全防护能力助力开发者应对刷单、虚假交易、恶意骗取补贴等营销作弊风险和批量注册、伪造身份等注册黑产风险,以及抢购后二次高价售卖等严重破坏品牌形象问题。

微信安全网关安全防护能力是基于微信提供的威胁情报信息,比如账号身份及用户特征等多维数据进行智能模型分析,综合判断当前请求是否安全,可以更精准识别假人假机、假人真机,真人假机,真人真机等各种不同黑灰产技术及手段。开发者可在核心业务流程中配置安全防护策略,支持由安全网关拦截或由安全网关识别后业务自行决策是否拦截,或对异常请求进行二次人机交互验证,灵活性更高。

# 能力优势

  1. 多层级防护,3道安全防线,从智能识别环境风险到安全网关风控策略拦截,再到高级安全防护,安全网关全力保障业务安全;
  2. 精准识别,基于智能分析模型,综合账号身份、设备、用户行为特征、环境等小程序场景下多重维度数据分析;
  3. 灵活性高,支持业务自定义拦截策略、业务自定义拦截显示页面、业务自定义人机交互验证页面;
  4. 人机交互验证,安全网关检测到用户当前网络环境异常,支持人机防水墙验证;
  5. 实时数据监控,分钟级拦截异常请求数据监控,支持查看详细拦截日志;

# 使用场景

  1. 营销优惠,诸如优惠券、秒杀、抽奖、新用户折扣券等营销活动场景,安全防护能力可以对设备、IP、用户行为、账号等多维检测,让羊毛党无所遁形,有效保护营销活动把优惠福利真正的给到目标用户。
  2. 集赞发帖,高赞评论获取活动礼品、发帖获取抽奖机会等活动场景,安全防护能力可以精准识别模拟器、群控、自动化点击等作弊手段,有效解决广告屠版、恶意灌水、刷票问题。
  3. 恶意注册,针对机器批量注册、垃圾小号、伪造身份等恶意注册行为,安全防护的账号风控可以进行有效识别并拦截。

# 多层级防护介绍

# 第一层防护

基于安全网关的微信私有链路,在请求进入安全网关的微信私有协议时,安全网关可识别各种协议挂、爬虫特征、模拟器攻击、黑灰产IP访问、DDoS攻击等各种异常请求,并进行及时拦截;经第一层安全防护的初步筛选后,将目前初步判定为正常的流量放入安全网关的微信服务器中进行第二层的流量筛选与清洗。(安全网关套餐中的 QPS 统计的即为第一次清洗后的并发请求,如发现接入安全网关后,同样的活动 QPS 有所下降,属正常情况。)

# 第二层防护

安全网关将对经过第一次初步清洗后的请求进行第二层的风控防护,针对伪造/篡改网关私有协议的请求进行清洗,同时结合用户请求频率、权限校验等风控能力筛选过滤掉非法请求、越权请求、高频请求等;经过第二层安全防护的二次清洗,已将90%以上的异常流量拦截掉,此时再将剩余的流量转发给业务源站。

# 第三层防护

为防止有漏网之鱼,安全网关上线了第三层自定义安全防护策略的高级能力,主动识别漏网之鱼,结合请求特征、设备信息、账号等多维的数据形成智能分析模型,对流量进行环境检测、智能验证等更高级别的处理,支持业务自行决策防护形态同时支持切换至安全性更高的验证码形态。以下将对第三层的高级安全防护能力进行详细介绍。


# 高级安全防护使用介绍

安全防护策略为微信安全网关高级能力,目前购买标准版(规格为:1000QPS*20Mbps)及以上版本网关套餐可在控制台进行配置,低于标准版套餐暂不支持使用该能力。

详细使用步骤如下:

# 1. 能力接入

前往 「Donut 开发平台-安全网关控制台-安防防护」 中进行配置。为不影响业务正常对外服务,不明显引起黑灰产对抗,可只将小程序业务场景中核心 URL 配置安全防护策略,未配置的小程序URL请求将直接放通不做处理。

# 2. 防护策略选择

安全防护当前支持 2 种防护策略,更多防护策略持续迭代中。控制台配置后,将分钟级生效,不需修改代码,不需小程序发版。

a. 网关拦截

选择网关拦截策略,安全网关将根据业务配置的响应内容,直接返回指定的响应页面,请求不再流转到业务侧。开发者可在页面配置对应的参数。

b. 业务决策

选择业务决策策略,安全网关将在请求的 header 中增加 x-wx-risk-rank 参数,业务收到请求后,可根据该参数执行业务侧处理策略。x-wx-risk-rank 参数取值范围 0-4,数字越大表示风险越高。风险等级说明和使用建议如下: 开发者可根据接口返回的风险等级数判别用户的风险程度,风险等级代表的意义及对应业务的使用,可参考下方的说明及建议,具体的使用可根据业务实际情况动态调整,以达到准确的拦截,保护业务健康有序的开展。

风险等级 建议处置方案
风险等级0 无风险,不做任何阻拦
风险等级1 低微可疑的风险,建议进行简单的验证(如验证码、短信等)
风险等级2 轻度可疑的风险,建议进行简单的验证(如验证码、短信等)
风险等级3 中度可疑的风险,建议根据业务场景采取一定措施避免伤害。例如,营销活动可降低高等级奖励的概率;打榜类活动对此类投票降低权重;登录注册要求二次验证等
风险等级4 高度可疑的风险,建议根据业务逻辑直接拦截。例如,红包类活动返回不中奖或最小额红包;打榜类活动不计算票数;登录/注册操作要求二次验证;高危业务可选择限制本次操作。

# 拓展能力-安全检测插件

支持开发者自定义选择安全检测插件,用作检测当前环境的安全性,接入后,可以提供比普通网关更全面,更准确的安全防护,用户需要完成环境验证,才可以继续进行操作。接入需要修改小程序代码,完成小程序发版后才生效。

详细接入指南如下:

# 快速开始

  1. 在小程序 app.json 中,引入【Donut 安全网关】插件,等待插件接入审核通过后,即可在小程序中使用。
{
   "plugins": {
    "gateway-challenge": {
      "version": "1.3.2",
      "provider": "wxfe70b3f986aad2fb"
    }
  }
}
  1. 在小程序 onLaunch 回调中,使用如下代码激活行为检测能力。
let gatewayChallenge = requirePlugin('gateway-challenge');
App({
  onLaunch() {
    gatewayChallenge.start();
  }
})
  1. 此时小程序将完成静默检测,检测通常需要几秒才能完成。检测期间不影响小程序的正常使用。

  2. (可选)在小程序中活动页面等关键页面中插入安全检测组件(不会影响页面渲染,在页面顶部插入即可)

<gateway-challenge
  <!-- 检测成功的回调 -->
  bindchallengesuccess="onChallengeSuccess"
  <!-- 检测失败的回调 -->
  bindchallengefail="onChallengeFail"
></gateway-challenge>
  1. 在小程序需要提交敏感信息内容的地方,获取检测结果。
Page({
  async onBtnClick() {
    let gatewayChallenge = requirePlugin('gateway-challenge');
    let res;
    try {
      await gatewayChallenge.getClearance(); // 获取检测结果
    } catch (e) {
      // 行为检测出现异常,提示并返回
      wx.showToast({
        title: "出现错误,请稍后再试。"
      });
      return;
    }
    wx.request({
      // 敏感接口请求,需要在检测完成后发起
    });
  }
});

# API

插件本身导出的方法如下(使用 requirePlugin):

interface ChallengePlugin {
    /* 初始化,需要在小程序加载时执行,只需要执行一次 */
    start: () => Promise<void>;
    
    /* 获取当前运行环境的校验结果(推荐),可以在任意时刻执行 */
    getClearance: () => Promise<ChallengeResult>;
    
    /* 监听检测成功的事件,在检测成功时执行回调 */
    onChallengeSuccess: (cb: (res: ChallengeResult) => void) => void;
    
    /* 监听检测失败的事件,在检测失败时执行回调 */
    onChallengeFail: (cb: () => void) => void;
}

interface ChallengeResult {
    err_code: number; // 检测错误码
    success: boolean; // 检测结果
    cid: string; // 检测 id,用于标识单次检测结果,在出现误判时可提供排查
}

检测组件支持的属性如下(使用 customComponent)

<gateway-challenge
  <!-- 检测成功的回调 -->
  bindchallengesuccess="onChallengeSuccess"
  <!-- 检测失败的回调 -->
  bindchallengefail="onChallengeFail"
></gateway-challenge>

# 兼容性

在微信 8.0.28 以上的客户端(不含)测试通过,低于这个版本会提示微信版本过低,请更新微信。

# 生命周期

检测结果会覆盖整次小程序的生命周期,直到用户退出小程序为止。

对于检测成功的情况,此次小程序生命周期中 getClearance 会同步返回成功,以及相同的 Clearance ID。对于检测失败的情况,getClearance 会重新触发一次检测,直到成功为止.

# 常见问题

Q:如何保证业务接口不被【爬虫、羊毛党、脚本】破解?
A:在安全网关检测插件执行后,再调用核心抢购,下单类接口。尽可能在 getClearance 异步返回后再执行 wx.request ,保证检测完成后再请求,从而确保请求的安全性。

Q:PC 端、微信开发者工具、部分低端设备无法完成检测/我被误拦截了,怎么处理?
A:我们针对大部分设备进行了定制的安全检测,如果用户遇到了异常情况,推荐先进行一次重试(getClearance),如果持续失败,可以提供用户此次的 cid 信息供我们定位和解决。

Q:如何提升检测的精度?
A:建议在 onLaunch 处拉起检测模块并调用 start 接口,同时在活动页面插入 <gateway-challenge>标签,并保证页面存在一定的显式交互(如点击,滚动,滑动等形式均可)。

Q:插件会对我的小程序造成性能影响吗?可以在分包中引入吗?
A:插件代码包大小为 200KB 左右,检测插件基本不会对小程序交互、加载时间等产生可感知的影响。插件可以在分包中引入并延迟加载。

Q:检测一次耗时多久?
A:在低端安卓机上,检测会在 1.5s 内完成。在主流性能的手机上,检测一般不会超过 500ms。

Q:安全检测会造成小程序卡顿吗?可以在检测过程中进行其他操作吗?
A:检测完全异步执行,不会阻塞小程序的主线程造成卡顿。在检测过程中,可以正常执行小程序的其他非敏感逻辑,只需要保证调用敏感接口之前,完成检测即可。