← 返回题目列表

小程序扫码能力如何使用?扫码结果如何做安全校验?

中等 第 25 / 32 题 更新于 2026/07/29
小程序扫码二维码安全校验

简化版

小程序扫码通常调用扫码 API 获取二维码内容,再根据业务类型解析并请求服务端校验。扫码结果不能直接信任,尤其是支付、核销、登录、设备绑定等场景,必须校验签名、有效期、状态和用户权限。

详细版

扫码常见场景包括商品识别、活动签到、优惠券核销、设备绑定、门店桌码和网页登录确认。流程一般是扫码、解析内容、判断类型、服务端校验、执行业务动作、展示结果。

注意点:

  • 二维码内容可能被伪造或过期。
  • 敏感业务不要在二维码里放明文权限。
  • 服务端要校验签名、状态、有效期和使用次数。
  • 核销类操作必须幂等。
  • 扫码失败、用户取消、无权限要分别处理。

完整版教学

一、扫码结果只是输入,不是事实

扫码 API 返回的是二维码或条形码中的字符串。这个字符串可能是 URL、短码、JSON、商品码,也可能是攻击者伪造的内容。前端拿到结果后直接执行关键操作,是非常危险的。

正确理解是:扫码只完成“读取载体”,业务事实必须由服务端判断。比如核销券码,前端扫描到 coupon=123 不代表这张券可用;服务端要判断券是否存在、是否属于当前门店、是否已核销、是否过期。

扫码得到 rawData
  → 前端解析类型
  → 服务端校验
  → 返回可执行动作
  → 前端展示结果

二、二维码内容要设计得短而可验证

二维码容量有限,内容越长越难扫,容错性也会下降。业务上常用短码或带签名的短参数,而不是把完整用户信息、订单信息和权限明文塞进去。

举例:一个桌码可以是 tableId=18&shopId=6&sig=abc,服务端用签名校验来源;更稳的是只放短码 T8K3D,服务端查表得到门店和桌号。短码泄露后也要有状态和有效期控制。

内容设计优点风险
明文 JSON前端解析方便长、易泄露、易篡改
URL 参数 + 签名可校验仍需控制长度
短码短、易扫依赖服务端查询
一次性 token安全性高生成和过期管理复杂

三、有效期和次数限制能挡住很多问题

二维码如果永久有效,一旦被拍照或转发,就可能长期被滥用。登录确认、核销、设备绑定等场景尤其需要短有效期和一次性使用。比如网页登录二维码可以设置 2 分钟有效,确认后立即失效。

数字例子:核销码有效期 24 小时,被截图转发的风险窗口就是 24 小时;如果改成 5 分钟动态码,风险窗口缩短到原来的 5 / 1440 ≈ 0.35%。业务体验和安全性要平衡,但不能没有过期机制。

二维码状态:
未使用 → 已扫描 → 已确认/已核销

  └─ 超过有效期 → 已过期

四、核销和绑定必须幂等

扫码核销很容易重复触发:用户连点、网络重试、店员重复扫码、接口超时后重试。服务端要保证同一张券或同一个绑定请求只能成功一次。否则优惠券可能被多次消费,设备可能被重复绑定到多个账号。

做法是用唯一业务键和状态机控制。例如优惠券表从 unused 改到 used 时带上条件 where status = unused,更新成功才算核销成功;如果已经是 used,返回“已核销”而不是再次扣减。

UPDATE coupon
SET status = 'used', used_at = NOW()
WHERE id = ? AND status = 'unused';

五、前端体验要区分取消和失败

用户取消扫码、摄像头不可用、二维码格式错误、服务端校验失败、业务已过期,这些都不应该展示同一个“扫码失败”。取消扫码通常不需要报错;格式错误要提示换一个码;校验失败要给清晰原因;系统异常才需要重试。

这种区分能减少客服问题。比如店员扫券时,如果只显示失败,他不知道是券过期、门店不匹配还是网络断了;如果明确显示“该券不属于当前门店”,就能立刻处理。

六、扫码来源和权限也要校验

有些二维码只能由特定角色扫描,例如店员核销、管理员绑定设备。服务端不能只校验二维码本身,还要校验当前扫码用户是否有权限执行动作。前端展示的角色信息不可信,必须以后端登录态和权限表为准。

同时要避免开放跳转风险。如果二维码中包含 URL,前端不应无条件跳转到任意地址。应限制域名白名单或把 URL 交给服务端解析后返回允许的页面路径。

记忆钩子:扫码读到的是“字符串”,不是“授权书”;所有关键业务都要回服务端确认。

七、常见误区与追问

  • 误区:扫到合法格式就可以执行业务。 格式正确只代表能解析,权限、状态、有效期仍要服务端校验。
  • 误区:二维码里放完整信息更省接口。 明文信息容易泄露和篡改,敏感业务应使用短码或签名 token。
  • 误区:扫码失败都应该提示重试。 用户取消、格式错误、无权限和系统异常的处理方式不同。
  • 追问:如何防止券被重复核销? 服务端用状态机和条件更新保证同一券只能从未使用变为已使用一次。
  • 追问:网页登录二维码为什么要短有效期? 截图和转发会扩大风险,短有效期能缩小攻击窗口。
  • 追问:二维码参数被篡改怎么办? 使用签名、短码服务端查询,并校验当前用户权限和业务状态。

八、加强记忆

扫码题用“读码、验码、验人、验状态、做幂等”来记。前端只负责读取和引导,二维码内容要短且可校验,服务端检查签名、有效期、次数和权限,核销绑定类操作必须幂等。这样设计,既能跑通流程,也能抗伪造和重复操作。