关于小程序session_key漏洞问题的解决2022-12-01
创始人
2024-03-17 03:43:51

业务背景:开发了小程序,使用了一段时间以后,小程序提示系统漏洞session_key的问题,在网上找了好多的博客,感觉好多写的没那么清晰,更偏重于理论,导致自己走了很多的弯路,为了更方便快捷的解决问题,我整理了一下解决这个问题的方法,更偏向于实际,没有理论的东西在里面,代码都写了注释,更便于阅读。

下面是官网的提示信息链接:

https://developers.weixin.qq.com/community/minihome/doc/000806202400280b0edd5866156c01?blockType=99&pass_ticket=evb7v4LC5Bza6jlRLzxsRqlC824r61rZJfB%2F9ae0PyrgbDgWUHRY1HRH%2FZ%2B65aKH

问题复现:现在是session_key暴漏在返回的参数中
在这里插入图片描述
修改后,从后端返回的参数如下;只有手机号码和appid,已经把session_key去掉了
在这里插入图片描述

原来获取session_key的方法

 getPhoneNumber(e) {if (e.detail.errMsg == "getPhoneNumber:ok") { //点击了“允许”按钮,//获取用户openidwx.request({//这里的this.data.loginCode 是从wx.login中获取的url: 'https://localhost:8080/getweixinweixin/getOpenId?code=' + this.data.loginCode,method: 'POST',success: res => {//解密获取手机号,从后端获取的openidthis.data.openId = res.data.openid//从后端获取的session_keythis.data.sessionKey = res.data.session_key//根据session_key加密var pc = new WXBizDataCrypt(this.data.appId, res.data.session_key)//解密var phoneData = pc.decryptData(e.detail.encryptedData, e.detail.iv)if (phoneData != null && phoneData != '') {wx.setStorageSync('phone', phoneData.phoneNumber)this.setData({phone: phoneData.phoneNumber})}}})

上面的code(this.data.loginCode,)是从下面的方法中获取的

  //登录wx.login({success: res => {this.data.loginCode = res.code}})
上面的这种方式,会把session_key暴漏在浏览器上面,所以下面是优化的方法,我们不在后端传session_key了,调用新的接口,这个接口中会返回手机号码和appid

现在获取appid和phone的方法,不获取session_key的方法
wx.login这个方法也可以删除了

  getPhoneNumber(e) {if (e.detail.errMsg == "getPhoneNumber:ok") { //点击了“允许”按钮,//获取用户openidwx.request({url: 'http://localhost:8080/getweixin/getOpenId?code=' + e.detail.code,   method: 'POST',success: res => {wx.setStorageSync('phone', res.data.phoneNumber)this.setData({phone: res.data.phoneNumber})

后台调用新接口的方法,可以参考,
第一步:先调用token的接口,获取token
第二步:用获取的token信息和code,调用第二个接口,获取手机号码和appid
接口地址:

//获取token的接口,APPID和APPSECRET需要申请
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
//获取手机号码和aiipId接口,需要传入token和code
https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=

后台Java代码调用示例;可以直接用的那种

 /***小程序获取手机号码和appid*/@PostMapping("/getOpenId")public Map getOpenId(@RequestParam(value = "code", required = false) String code) {String accessTokenUrl = WeixinConstants.accessTokenUrl.replace("APPID", appId).replace("APPSECRET", appSecret);String response_token = HttpRequest.get(accessTokenUrl).timeout(60000).execute().body();JSONObject token = JSON.parseObject(response_token);// 获取tokenString url = WeixinConstants.new_openIdUrl + token.getString("access_token");//Map paramMap = new HashMap<>();paramMap.put("code", code);HttpHeaders headers = new HttpHeaders();HttpEntity> httpEntity = new HttpEntity<>(paramMap, headers);//String response = restTemplate.postForEntity(url, httpEntity, String.class).getBody();//String return_openid = "";String phoneNumber = "";JSONObject json_data= new JSONObject();//判断返回值if(response != null && !"".equals(response)) {//JSONObject jsonObject = JSONObject.parseObject(response);// 获取第一层的数据JSONObject first_data = jsonObject.getJSONObject("phone_info");//获取第二层的数据String phone_number = first_data.get("phoneNumber").toString();json_data.put("phoneNumber",phone_number);////获取第二层的watermark数据JSONObject watermark = first_data.getJSONObject("watermark");//测试获取第三层的数据String appid = watermark.get("appid").toString();json_data.put("appid",appid);}//处理返回的格式Map map = JSON.parseObject(json_data.toString() ,Map.class);return map;}

需要在pom.xml中引入下面的jar包

 cn.hutoolhutool-all5.7.7

暂时梳理这些:有问题欢迎留言交流

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...