纯前端过滤可应急,但上线必须搭配云函数调用微信msg_sec_check接口,否则过不了审核,也挡不住绕过前端的恶意提交;前端用check-word-safe插件实时替换,云函数才是最终裁判,filter结果不可直接入库,须以code===0为准。

uniCloud 实现敏感词自动过滤并替换,关键不在于“能不能做”,而在于**选对方案层级**:前端轻量过滤用 SDK,后端强校验必须走微信官方接口。直接上结论:**纯前端过滤可应急,但上线必须搭配云函数调用微信 msg_sec_check 接口,否则过不了审核,也挡不住绕过前端的恶意提交**。
前端用 check-word-safe 做即时替换(适合输入框实时提示)
这个插件是纯 JS 实现,不发请求,响应快,适合用户打字时就模糊遮盖,但无法替代服务端校验。
常见错误现象:只在前端过滤,用户禁用 JS 或抓包重放就能绕过;或者没清空默认词库,导致“粉刷匠”这种正常词也被误杀。
- 安装后必须显式初始化:
import { checkSafeWord } from '@/uni_modules/check-word-safe/js_sdk/index.js' - 默认词库含“法轮”“炸弹”等,但不含“粉刷匠”——如果业务需要屏蔽特定词,得主动调用
addWords(['粉刷匠']) - 替换字符长度要匹配原词,否则排版错乱;
filter()返回的是字符串,不是布尔值,别当成verify()用 - 注意 Vue 响应式失效:直接赋值给
data属性不会触发更新,建议用computed或watch包一层
云函数调用微信 msg_sec_check 接口(必须做,否则内容风控不达标)
微信这个接口返回的是 errcode === 0 才代表“无违规”,不是靠前端判断关键词是否存在。很多开发者卡在 access_token 过期或签名格式不对,导致一直返回 40001。
使用场景:表单提交、评论发布、后台管理批量审核等所有需要落库的操作前。
-
access_token有效期 2 小时,不能硬编码;云函数里必须封装getAccessToken并缓存到uniCloud.database,否则高并发下频繁刷新会触发频率限制 - 请求体必须是 JSON 格式,
contentType: 'json'不能漏,否则微信返回40001或41005 - 文本长度上限 500 字符,超长需分段检测,否则
errcode: 87014 - 错误码
40001是 token 失效,45009是日调用量超限,87014是文本过长——别统一当“有敏感词”处理
前后端配合时容易踩的坑
最典型的陷阱是:前端用插件过滤了,云函数又调微信接口,结果同一句话被双重替换,变成“***!!***”,或者因两次检测逻辑不一致,出现“前端说安全,云函数报违规”的矛盾。
- 前端只做体验层遮盖,云函数才是最终裁判;
filter()结果不能直接入库,必须以云函数返回的code === 0为准 - 云函数返回的
msg字段只是提示,真正要拦截得看code:0 放行,-1 拒绝提交,别依赖msg内容做逻辑分支 - 测试时别用
console.log查 token,微信接口对空格、换行、BOM 头极其敏感;建议用encodeURIComponent对参数二次编码 - 敏感图片检测要用
img_sec_check,传 Base64 必须带data:image/jpeg;base64,前缀,否则返回41005
性能与兼容性取舍点
本地插件过滤毫秒级响应,微信接口平均耗时 300–800ms。如果用户提交频率高,比如弹幕场景,必须加防抖 + 本地缓存结果,否则体验断层。
- 云函数冷启动延迟明显,首次调用可能超 1s;把
httpclient.request放在exports.main外层预热无效,得靠定时触发保持常驻 - HBuilderX 4.25+ 才支持
timeout参数,低于该版本云函数超时固定为 60s,无法设为 5s 防雪崩 - 小程序端调用云对象比
callFunction更简洁,但 H5 端不支持云对象,必须统一用callFunction兼容多端 - 别在云函数里用
Buffer.from处理大图,内存溢出风险高;图片检测建议前端压缩到 1MB 以内再传











