当前位置: 首页 > news >正文

微信小程序 XSS 防护知识整理

场景1:用户输入表单(如评论框)

错误做法:直接渲染未过滤的用户输入
// WXML
<view>{{ userInput }}</view>// JS(用户输入了恶意内容)
Page({data: { userInput: '<script>alert("XSS攻击")</script>' }
})

结果:小程序会自动转义,页面显示为文本:<script>alert("XSS攻击")</script>,不会执行脚本。
防护原理:数据绑定 ({{ }}) 默认转义 HTML 特殊字符(如 <&lt;)。


场景2:动态渲染富文本(如用户发布的文章)

错误做法:直接用 rich-text 渲染未过滤的内容
// WXML
<rich-text nodes="{{ userContent }}"></rich-text>// JS(用户输入了危险内容)
Page({data: {userContent: '<img src="x" onerror="alert(1)">' // 包含恶意 onerror 事件}
})

结果:小程序 rich-text 组件会自动过滤 onerror 属性,最终渲染成 <img src="x">
防护原理rich-text 组件内置黑名单,过滤 scriptiframe 和危险属性(如 onclickonerror)。


场景3:使用 web-view 嵌入外部网页

错误做法:加载不可信的第三方网页
<web-view src="{{ externalUrl }}"></web-view>// JS(外部链接被篡改)
Page({data: {externalUrl: 'https://恶意网站.com?attack=...'}
})

风险:外部网页可能含有 XSS 攻击代码,通过 web-view 传播。
正确做法

  1. 限制 web-view 只能加载白名单域名(在小程序后台配置)。
  2. src 参数做合法性校验:
// 校验 URL 是否合法
if (!isValidUrl(externalUrl)) {externalUrl = ''; // 拒绝加载
}

场景4:调用接口获取数据

错误做法:信任后端返回的未过滤数据
// 假设后端返回数据:{ content: '<script>恶意代码</script>' }
wx.request({url: 'api/getData',success: (res) => {this.setData({ content: res.data.content }); // 直接渲染}
})

结果:虽然小程序默认转义,但如果数据用于不安全场景(如 web-view),仍可能引发风险。
正确做法

  1. 后端返回前对数据做 XSS 过滤。
  2. 前端对关键内容二次过滤:
// 使用微信提供的安全过滤函数(示例)
const safeContent = filterXSS(res.data.content);
this.setData({ content: safeContent });

场景5:用户昵称/简介中的特殊字符

错误做法:允许用户输入任意字符
// 用户输入昵称:<img src=x onerror=alert(1)>
Page({data: { nickname: userInput }
})

结果:渲染到页面时会被转义,但若其他地方误用(如转发到其他系统),可能引发风险。
正确做法

  1. 输入时过滤危险字符:
// 前端过滤
const cleanNickname = nickname.replace(/[<>"'&]/g, '');// 或调用微信内容安全接口(推荐)
wx.msgSecCheck({content: nickname,success: () => { /* 内容安全 */ },fail: () => { /* 拦截危险内容 */ }
})

总结:XSS 防护口诀

  1. 数据绑定用双花{{ }} 默认转义,别用 innerHTML
  2. 富文本要过滤rich-text 或安全解析库。
  3. 用户输入必校验:前后端双重过滤。
  4. 动态代码要禁用:别用 evalnew Function
  5. 外部内容严管控web-view 域名白名单。

附:XSS 测试工具

  • 安全测试输入:尝试输入以下内容,检查是否被转义:
    <img src=x onerror=alert(1)>   <!-- 测试HTML属性 -->
    <script>alert(1)</script>      <!-- 测试脚本标签 -->
    javascript:alert(1)            <!-- 测试URL协议 -->
    
http://www.xdnf.cn/news/227359.html

相关文章:

  • HTML ASCII 编码详解
  • 遗传算法(Genetic Algorithm,GA)
  • 5、SpringBoot整合RabbitMQ
  • 39.RocketMQ高性能核心原理与源码架构剖析
  • iview表单提交验证时,出现空值参数被过滤掉不提交的问题解决
  • 大连理工大学选修课——机器学习笔记(2):机器学习的一般原理
  • 智能检索革命全景透视——基于《搜索引擎信息检索困境破解体系》深度拆解
  • 数据结构篇:线性表的另一表达—链表之单链表(下篇)
  • 宇树科技开启“人形机器人格斗盛宴”
  • LeetCode 2302.统计得分小于 K 的子数组数目:滑动窗口(不需要前缀和)
  • Java架构师深度技术面试:从核心基础到分布式架构全解析
  • Milvus(11):动态字段、可归零和默认值
  • 基于开源AI智能名片链动2+1模式S2B2C商城小程序的私域电商与微商融合创新研究
  • 基于Docker的Elasticsearch ARM64架构镜像构建实践
  • vue 和 html 的区别
  • 20250430在ubuntu14.04.6系统上查看系统实时网速
  • 运营岗位选择
  • 多用户远程 Debugger 服务隔离方案技术实践
  • Java使用 MyBatis-Plus 实现前端组装查询语句、后端动态执行查询的功能,
  • 使用vue开发electron
  • Git从入门到精通-第二章-工具配置
  • 软考中级-软件设计师 数据结构(手写笔记)
  • 文献分享:CovEpiAb-冠状病毒免疫表位及抗体数据库
  • HCIP-数据通信datacom认证
  • 【RustDesk 】中继1:压力测试 Python 版 RustDesk 中继服务器
  • 【安全扫描器原理】基于协议的服务扫描器
  • 欧洲分子生物学实验室EMBL介绍
  • 详解具身智能机器人开源数据集:RoboMIND
  • 数字孪生技术十大创新应用场景与工程实践
  • Vue3 Echarts 3D立方体柱状图实现教程