前言
最近不知道干什么,简单学学偏向开发的知识吧,小程序的漏洞还是比较多的,因为小程序访问和注册都需要通过微信,这个门槛使得小程序可以免受一些漏扫攻击,之前自己对小程序安全的认识还是,bp+Proxifier抓包,反编译看源码找接口,反正还是web那一套,个人感觉其实够用了,但是耐不住好奇心
借此希望这篇文章不单单是简单的知识记录,希望可以学到一些新的编程设计思想,说不定学安卓的时候就能用上了那
关于前后端分离的一些认识
在学习小程序开发的时候,我个人感觉跟vue很像,都是前端路由,后端接口服务,结合我之前对web开发的学习,现在总结一些对前后端分离的一些认识
前后端分离有三个阶段
第一阶段是前后端完全不分离,如(PHP / JSP / ASPX)
访问路径通常为相对文件路径,访问主体是一个文件,代码如同JS一样嵌在或者包含在页面中,页面完全由后端渲染
第二阶段是代码层分离,如(Spring Boot + templates / ThinkPHP)
访问主体依旧是一个文件,称为模板文件,但是后端逻辑被抽象成一个一个接口,方便项目管理,从浏览器这个视角来看其实没什么变化
第三阶段是架构层独立,如(Vue / 小程序)
这个时候的网站可以称得上是应用程序,初始化时需要先加载所有的 JS 代码和页面,前端框架在浏览器端独立运行
前两个阶段返回包是html或者html+AJAX获取的后端 API 请求数据,称为服务端渲染(SSR)
最后一个阶段返回包就只剩下后端 API 请求数据,称为客户端渲染(CSR)
但是需要注意的是小程序是不兼容script标签也没dom,所以xss就别想了
小程序项目目录结构
因为小程序前端和vue基本差不多,并且我又不打算搞小程序开发,所以就打算简单写写了
1 | ├── app.js //加载页面前的预启动逻辑 |
第一次访问后的调用顺序
app.js
└─ App() 注册
└─ onLaunch(options) ← 全局最先执行
└─ onShow(options)app.json
└─ 解析 pages[]
└─ 确定首页(pages[0])首页 Page 初始化
└─ Page() 注册
└─ onLoad(query)
└─ onShow()
└─ onReady()page
<view bind:tap="viewTap">{{num}}</view>1
2
3
4
5
6
7
8
9
10
11
12Page({
onLoad: function (options) {},//生命周期函数
onReady: function () {},
data: {//初始数据
num: 0,
},
viewTap: function () {//自定义触发函数
this.setData({
num: this.data.num + 1,
});
},
});小程序是双线程模型(感觉叫双进程模型更合适),页面渲染相关的数据只能通过 setData 修改,直接赋值只会修改JS 内存里的值,不会触发视图更新
1
2
3逻辑层(JS)
↕ setData 通信
视图层(WXML / WXSS)与后端交互
1
2
3
4
5
6
7
8
9
10
11
12
13
14wx.request({
url: 'https://api.example.com/user/list',
method: 'GET',
data: {},
success(res) {
console.log(res.data)
},
fail(err) {
wx.navigateTo({//跳转页面
url: '/pages/404',
})
}
})小程序手机号一键登录
老版本登录
小程序前端回调生成用户登录凭证
1 | wx.login({ |
后端根据用户登录凭证和小程序密钥获取用户唯一标识和会话密钥
1 | //GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=APPsecret&js_code=code&grant_type="uthorization_code" |
从基础库2.21.2之前,小程序前端button在用户点击后,前端回调获取到手机号密文信息,和对应的iv
1 | <button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button> |
新版本登录
新版本登录在获取用户手机号信息的方式发生了改变,杜绝了因AppSecret泄露导致的任意用户登录
从基础库2.21.2之后,小程序前端button在用户点击后,前端回调获取到手机号动态令牌
1 | <button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button> |
使用小程序密钥获取后台接口调用凭据
1 | //GET https://api.weixin.qq.com/cgi-bin/token?grant_type="client_credential"&appid=APPID&secret=APPSECRET |
使用后台接口调用凭据和前面获取到的手机号动态令牌,获取手机号
1 | //POST https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=ACCESS_TOKEN |