• 开发教程与代码示例
  • 入门
  • 小程序框架
  • 小程序运行时
  • 自定义组件
  • 基础教程
  • 能力教程
  • 性能优化
  • 安全
  • 安全开发指南
  • 小程序隐私协议开发指南
  • 安全开发指南

    收藏
    我的收藏

    安全开发原则

    本文档展示小程序开发常见的安全问题,并针对性的给出了小程序安全原则和安全措施。旨在帮助小程序开发者在开发阶段解决安全问题,防止小程序对业务和数据造成损失。
    小程序开发者须遵循以下安全原则:
      1.用户信息最小化收集和使用:只申请必要的用户信息并向用户说明申请原因,禁止明文传输和保存用户信息,必要场景敏感信息建议脱敏。
      2.最小权限原则:代码或用户只拥有完成工作的最小权限等级或许可,不赋予不必要权限。
      3.零信任原则:服务器接收到的数据,须进行必要的数据校验后再使用。对服务器的访问,须通过有效的身份鉴权。
      4.谨慎服务原则:重要或敏感的逻辑应放在服务器运行。

    常见开发场景的安全风险

    敏感信息传输和保存

    开发场景
    安全风险
    网络请求
    使用 HTTP 明文传输数据,可导致信息泄露漏洞,小程序必须使用 HTTPS 协议。
    敏感信息存储
    敏感信息明文存储,在储存文件外泄后,可导致信息泄露漏洞
    敏感信息展示
    在使用敏感信息时,如果不对敏感信息脱敏,可导致信息泄露漏洞
    敏感信息脱敏参考如下:
    敏感信息类型
    脱敏规范
    手机号
    国家码可完全显示,个人手机号保留前三位和后两位,如:138******12
    身份证
    仅显示第一位和最后一位,如:1****************5
    姓名
    仅显示第一位,如:李**
    银行卡
    仅显示后四位,如:************1234
    邮箱
    仅显示第一位和@,如:a****@*******

    登录和注册

    开发场景
    安全风险
    登录、注册接口
    登录、注册相关接口需要控制访问频率,否则可导致包爆破撞库漏洞
    session_key 需要存放在服务器,不对外传输,否则可导致信息泄露漏洞

    数据增删改查

    开发场景
    安全风险
    数据库访问
    采用参数直接拼接方式构造sql语句,可导致 SQL 注入漏洞
    用户信息查询
    查询接口需要对用户鉴权,否则可导致越权/未授权漏洞
    生成用户 ID、订单 ID 等
    用户 ID、订单 ID 等是否随机生成,有规律的ID容易被猜测加以利用,可导致越权操作漏洞

    多线程并发的条件竞争

    开发场景
    安全风险
    购买支付、优惠活动、文件上传等
    多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作,可导致条件竞争漏洞

    文件上传/下载

    开发场景
    安全风险
    文件下载
    接受用户指定的路径和文件名,但未对用户指定的路径和文件名做限制,可导致任意文件下载漏洞
    文件上传
    未严格限制用户上传的文件后缀和文件类型,可导致任意文件下载漏洞

    常见安全漏洞及开发建议

    信息泄露漏洞

    漏洞介绍

    信息泄露主要是由于一些配置缺陷或是接口功能未屏蔽敏感信息所导致,可能泄露源码、数据库备份、用户敏感信息、SQL 语句、应用配置信息、敏感目录等等。

    漏洞危害

      敏感机密信息泄露
      源码被分析、传播
      泄露的信息导致更多漏洞攻击

    开发建议

      关闭 debug 模式,防止调试信息泄露。或是当出错时,统一返回一个错误页面或直接跳转至首页。
      针对接口数据,应结合业务场景判断是否可以返回用户的真实信息或是其他敏感信息。
      敏感信息不应以明文、注释、可逆的编码方式(如 base64)、不安全散列函数(如 MD5、 SHA1)出现。

    越权操作漏洞

    漏洞介绍

    常见的越权分为两种:水平越权、垂直越权。一般来说系统会分为三类用户:特权用户、普通用户、非登录用户。
      水平越权,指普通用户 A 可以查看普通用户 B 的信息。例如,我发现某购物网站一个订单系统的水平越权漏洞,就可以越权查看别人的订单。
      垂直越权,指普通用户可以使用特权用户的功能。

    漏洞代码示例

    水平越权

    没有添加鉴权:
    select * from page where page_id = 123
    添加了鉴权:
    select * from page where page_id = 123 and page_user = 'user'
    造成水平越权的核心问题是没有判断该信息是否属于当前用户。

    垂直越权

    没有添加鉴权:
    select * from page where user_id = 123
    添加了鉴权:
    select * from page where user_id = 123 and identity_admin = 1
    这种越权漏洞普遍为普通用户越权至特权用户。所以造成的原因就是进行特权用户功能时,未判断该用户是否为特权用户。

    漏洞危害

      垂直越权漏洞会导致低权限用户用来执行高权限用户的功能,获取高权限用户的账号信息,执行高权限用户的操作功能。
      水平越权会导致同一层级间的用户可以互相访问到对方的敏感信息,如姓名、手机号、联系地址、个人资料、订单记录等。同时还可能会以其他平级权限用户的身份来执行某些功能,如删除,添加,修改等。

    开发建议

      设计时,应对用户 、订单等根据 ID 查询或操作的字段以随机数生成。
      对操作用户所拥有的权限和要操作的资源做关联鉴权。

    爆破撞库漏洞

    漏洞介绍

    爆破撞库经常出现在登录、注册接口,由于没有做限制导致可以批量尝试用户密码、用户验证码是否正确。
    爆破攻击者通过不断地改变密码或验证码,频繁的对登录、注册访问,直到通过服务器校验。
    撞库攻击者常用的手法是,准备大量的之前已经流传出去的账号密码数据库,对登录口等位置进行大量尝试。

    漏洞危害

    账户泄露,无法维护用户资产

    开发建议

      服务器禁用默认账号,修改弱口令密码。
      接口增加访问频控,禁止无频率限制访问敏感接口。
      模糊提示性文案(例:用户名或密码不正确)。

    SQL 注入漏洞

    漏洞介绍

    SQL 注入(SQL Injection),就是通过把 SQL 命令插入到表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令,从而攻击服务器数据库。可能导致数据被窃取、更改、删除,以及进一步导致网站被嵌入恶意代码、被植入后门程序等危害。

    漏洞代码示例

    public static void main(String[] args){ Scanner scanner = new Scanner(System.in); System.out.println("请输入用户名"); String username = scanner.nextLine(); System.out.println("请输入密码"); String password = scanner.nextLine(); //sql语句拼接 String sql = "select * from user where username='" + username+"'and password='"+password+"'"; //sql语句执行 boolean flag = execute(sql); //如果返回true即登录成功 if(flag){ System.out.println("登录成功"); }else { System.out.println("登录失败"); } }
    如果输入密码为 123 ' or ' 1=1 这样 SQL 语句的执行结果永远为真,导致任意账户登录。

    漏洞危害:

      敏感机密信息泄露
      数据被篡改
      服务器被远程控制
      破坏硬盘数据,服务无法正常运行

    开发建议

      对进入数据库的特殊字符' " \ <> & * ;等进行转义处理,或编码转换。
      使用数据库提供的参数化查询操作数据库,禁止字符串拼接为 SQL 语句。
      参数类型必须和数据库一致。
      不对外暴露 SQL 报错信息,防止攻击者进一步分析。
      应确保数据编码统一,防止过滤模型被绕过。

    条件竞争漏洞

    漏洞介绍

    条件竞争漏洞是一种服务器端的漏洞,由于服务器在处理不同用户的请求时是并发进行的,因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生。常见的场景比如:秒杀下单、提现、兑换奖品等,通过多线程并发请求,来达到以一换多、无中生有的效果。

    漏洞代码示例

    boolean flag = JudgingBalance(amount); // 从数据库中查询用户剩余的金额是否大于提前金额 if(flag){ Withdraw(); // 执行提现操作 }
    常规场景下程序会线性执行,但当出现并发请求时,有可能出现请求 A 和请求 B 都刚好执行完第 1 行语句的情况,此时两个请求的 flag 都为 true,也就是可以通过第 3 行代码的判断,如果请求 A 和请求提现金额的总和大于余额,将会导致透支提现。

    漏洞危害

      资产超发
      文件上传绕过检查

    开发建议

      操作数据库逻辑块进行上锁。
      对于文件上传,一定要经过充分完整的检查之后再上传而不是先上传再辨别。

    文件上传漏洞

    漏洞介绍

    文件上传漏洞是服务器端未对上传文件进行合法性校验,从而导致任意格式文件上传,在解析到恶意文件时,导致 webshell 入侵。

    漏洞危害

      敏感机密信息泄露
      数据被篡改
      服务器被远程控制
      破坏硬盘数据,服务无法正常运行

    开发建议

      对上传文件大小做限制
      对上传文件后缀做白名单限制
      上传路径不可更改
      保存文件名随机生成
      上传文件保存的目录不解析可执行文件

    文件下载漏洞

    漏洞介绍

    文件下载漏洞是指允许用户通过指定路径和文件名的方式来下载对应的文件,但服务器端未对下载文件进行限制,导致可以下载任意位置的文件。

    漏洞危害

      敏感机密信息泄露。
      泄露服务器信息,导致进一步漏洞攻击。

    开发建议

      过滤「. .」,使用户在 URL 中不能回溯上级目录。
      对下载目录进行限制,禁止任意目录访问。
      如非必要,不要使用动态下载功能。