阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      开发微信小程序之前需要了解的安全问题

      网页的隐患

      Web 技术是非常开放灵活的,开发者可以利用 JavaScript 脚本随意地操作 DOM,这是会带来以下的问题:

      随意地跳转网页

      随意地跳转网页,改变界面上的任意内容

      开发者可以利用 JavaScript 脚本随意地跳转网页,或是改变界面上的任意内容。当然,恶意攻击者也能利用这种便利。

      获取页面数据

      小程序也提供可一种可以展示敏感数据的组件,<open-data>能展示包括用户昵称、头像、性别、地理位置等信息(无需用户授权)。

      如果开发者可以操作 DOM,意味着他们可以随意拿到用户的敏感信息。

      常见的前端漏洞

      开发者们普遍重视的安全漏洞,在前端常见的有 XSS 和 CSRF,XSS 是通过注入 JavaScript 脚本的方式来达到特定目的,而 CSRF 则是利用了 cookie。

      XSS 在双线程的设计中就被过滤了,而 CSRF 会在后面讲到。

      小程序的做法

      安全的逻辑层

      没错,就是沙箱环境。通过提供一个纯 JavaScript 的解释执行环境,这个环境没有浏览器相关接口,当然也不用担心操作 DOM、跳转等问题了。在 iOS 下是用内置的 JavaScriptCore 框架,在安卓下是 JsCore 环境(旧版是腾讯 x5 内核提供,新版是 v8 提供)。

      客户端系统有 JavaScript 的解释引擎,则可以创建一个单独的线程去执行 JavaScript,这个环境下只执行有关小程序业务逻辑的代码。界面渲染相关的任务呢,就丢到 webview 线程里面,通过逻辑层代码去控制渲染哪些界面。

      把开发者的 JS 逻辑代码放到单独的线程去运行,因为不在 Webview 线程里,所以这个环境没有 Webview 任何接口,自然的开发者就没法直接操作 DOM,也就没法动态去更改界面或者抓取页面数据。

      同时小程序不支持动态载入脚本,XSS 漏洞自然也无缝可钻。

      审核机制的管控

      为了保证小程序的质量,以及符合相关的规范,小程序的发布是需要经过审核的。经过审核的小程序才能对外发布,同时在出现问题时,小程序会被下架停用。

      另外,每个微信小程序需要事先设置一个通讯域名,小程序只可以跟指定的域名与进行网络通信,包括普通 HTTPS 请求、上传文件、下载文件和 WebSocket 通信,参考框架-网络。这些通讯域名,也都必须要求通过备案。

      同时,小程序必须使用 HTTPS 发起网络请求。请求时系统会对服务器域名使用的 HTTPS 证书进行校验,如果校验失败,则请求不能成功发起。

      这些种种的限制和管理模式,都进一步保障了用户的数据和隐私安全。

      安全的登录机制

      跨站请求攻击(CSRF),简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。

      这利用了 web 中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。通常的罪魁祸首则是浏览器的 cookie 登录态。

      除了检查 Referer 字段来防范,更有效的一种方式是使用 token。小程序也是这么做的。

      小程序登录

      小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。参考官方时序图:

      在小程序中调用wx.login(),能拿到一个code作为用户登录凭证(有效期五分钟)。

      在开发者服务器后台,开发者可使用code换取openid和session_key等信息(code只能使用一次)。

      可靠的 code

      假设现在有个接口,请求 https://test.com/getUserInfo?id=1 拉取到微信用户 id 为 1 在我们业务侧的个人信息,那么黑客就可以通过遍历所有的 id,把整个业务侧的个人信息数据全部拉走,会给业务带来很大的安全风险。

      由于code 5 分钟后会过期,如果黑客要冒充一个用户的话,那他就必须在 5 分钟内穷举所有的身份证 id,然后去开发者服务器换取真实的用户身份。而code在成功换取一次信息之后也会立即失效,即便凭证code生成时间还没过期。

      显然,黑客要付出非常大的成本才能获取到一个用户信息,同时,开发者服务器也可以通过一些技术手段检测到5分钟内频繁从某个 ip 发送过来的登录请求,从而拒绝掉这些请求。

      需要保护的 AppSecret

      开发者的后台就拿到了前边wx.login()所生成的微信登录凭证code,此时就可以拿这个code到微信服务器换取微信用户身份。微信服务器为了确保拿code过来换取身份信息的人就是刚刚对应的小程序开发者,到微信服务器的请求要同时带上AppId和AppSecret。

      AppId和AppSecret是微信鉴别开发者身份的重要信息,AppId是公开信息,泄露AppId不会带来安全风险,但是AppSecret是开发者的隐私数据不应该泄露,开发者需要好好保护。

      小程序的文件系统

      文件主要分为两大类

      • 代码包文件:代码包文件指的是在项目目录中添加的文件。
      • 本地文件:通过调用接口本地产生,或通过网络下载下来,存储到本地的文件。

      其中本地文件又分为三种

      • 本地临时文件:临时产生,随时会被回收的文件。不限制存储大小。
      • 本地缓存文件:小程序通过接口把本地临时文件缓存后产生的文件,不能自定义目录和文件名。跟本地用户文件共计,普通小程序最多可存储 10MB,游戏类目的小程序最多可存储 50MB。
      • 本地用户文件:小程序通过接口把本地临时文件缓存后产生的文件,允许自定义目录和文件名。跟本地缓存文件共计,普通小程序最多可存储 10MB,游戏类目的小程序最多可存储 50MB。

      具体参考: https://developers.weixin.qq.com/miniprogram/dev/framework/ability/file-system.html

      小程序删除后,会发生什么

      删除的数据

      小程序本体

      小程序与 app、软件一样,本身也是一段电脑程序。

      所以,当我们将小程序从列表中删除后,微信会将小程序本体从手机中清理掉,就像「卸载」普通 app 或者软件一样。

      在删除之后,如果你再次打开这个小程序,那么,微信会将最新版本的小程序重新下载回你的手机。

      缓存

      微信允许小程序在本地存放不超过 10 MB 的数据作为缓存,便于开发者优化小程序的体验。

      当你将小程序从列表中删除,这些本地缓存也会全部被清理掉,再也不回来。

      所以,一旦删除,下次再使用这个小程序,原来的缓存将无法恢复。

      权限设置

      很多小程序在第一次打开的时候,会弹出一个「请求授权」的窗口。

      无论你选择「同意」或「拒绝」,你的选择都被记录在微信的服务器。即使换一台手机,只要登录同一个微信号,微信也会记住你的选择。

      但是,如果你将小程序从列表中删除,那么,有关这个小程序的授权偏好同时也会被删除。

      下次再打开这个小程序,微信会再次询问你是否授权。

      什么数据不会被删除?

      1. 被发送至开发者服务器的数据

      当你在小程序里上传照片,或者发布留言,这些数据都会上传至开发者的服务器。

      而删除小程序后,保存在开发者服务器的数据,是不会被删除的。即是说,如果你在相册小程序里上传了照片,删除小程序后重新再打开,照片还会存在。

      所以,除非是开发者自己删除了数据,否则,这些数据会一直存储在开发者服务器中。

      2. 微信收集的用户数据

      没错,微信自己也会收集数据。

      微信会为小程序开发者收集一些匿名的小程序用户特征数据。例如,你的所在地、机型、年龄、访问方式等等。

      除了这些,微信还会收集小程序运行时的错误,这些错误里可能会包含你在小程序里的操作,便于开发者定位小程序的问题。

      即使你将小程序从列表中删除,这些数据也不会从微信的服务器上删掉。而且,开发者也没有办法主动关闭它。(当然,也不会有几个开发者愿意主动关闭的。¯_(ツ)_/¯)

      参考:

      目录
      目录