关于小程序session_key漏洞问题的解决2022-12-01

这篇具有很好参考价值的文章主要介绍了关于小程序session_key漏洞问题的解决2022-12-01。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

问题复现:现在是session_key暴漏在返回的参数中
关于小程序session_key漏洞问题的解决2022-12-01
修改后,从后端返回的参数如下;只有手机号码和appid,已经把session_key去掉了
关于小程序session_key漏洞问题的解决2022-12-01

原来获取session_key的方法

 getPhoneNumber(e) {
    if (e.detail.errMsg == "getPhoneNumber:ok") { //点击了“允许”按钮,
      //获取用户openid
      wx.request({
       //这里的this.data.loginCode 是从wx.login中获取的
        url: 'https://localhost:8080/getweixinweixin/getOpenId?code=' + this.data.loginCode,
        method: 'POST',
        success: res => {
          //解密获取手机号,从后端获取的openid
          this.data.openId = res.data.openid
          //从后端获取的session_key
          this.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") { //点击了“允许”按钮,
      //获取用户openid
      wx.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);
        // 获取token
        String url = WeixinConstants.new_openIdUrl + token.getString("access_token");
        //
        Map<String, String> paramMap = new HashMap<>();
        paramMap.put("code", code);
        HttpHeaders headers = new HttpHeaders();
        HttpEntity<Map<String, String>> 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包

 <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <!--<version>5.0.3</version>-->
            <version>5.7.7</version>
        </dependency>

暂时梳理这些:有问题欢迎留言交流文章来源地址https://www.toymoban.com/news/detail-484384.html

到了这里,关于关于小程序session_key漏洞问题的解决2022-12-01的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于打开idea显示“Your idea evaluation has expired. Your session will be limited to 30 minutes”问题的解决办法(两步)

    (先解决问题,再说一下原因,解决问题是第一步,知道问题原因避免后期出现是关键) 第一步: 打开idea中选择Help中的Eval Reset; 第二步: 勾选\\\"Auto reset before per restart\\\"项,再选择Reset;即可解决问题 在 IntelliJ IDEA 中,选择 Help - Eval Reset - Auto reset before per restart,再选择 Res

    2024年01月16日
    浏览(44)
  • STLINK下载程序出现cannot access target. shutting down debug session问题解决的一般步骤

    不要觉得只有USB接口线会出问题,排线也有可能出问题。 通过上网搜索得知,查找代码是不是使用了下载的接口 PB3和PB4 I/O口,如果使用了,初始化了的话,需要改为其他 IO 口 有时会出现Cannot Load Flash Programming Algorithm 有时会出现Could not stop Cortex-M device.Please check the JTAG cabl

    2024年02月15日
    浏览(42)
  • Django后台和微信小程序之间使用session方法,出现小程序访问404,Django后台找不到指定的URL问题解决

    在Django后台开启session中间件,小程序端请求Django后台的session属性,在Django中执行session会话操作,并响应应答给小程序,在小程序端执行cookie的缓存和读取操作。 在上述的功能完成后,小程序端访问时出现404错误,Django后台找不到指定的URL路径。 1、排查Django后台的URL路径是

    2024年02月06日
    浏览(47)
  • std::map使用方式以及注意事项(关于相同key的问题)

    std::map的使用在C++开发中也是经常会用到的一些东西,这里进行一些简单的使用记录,包括如何插入、删除以及修改等。 map的插入使用的是insert的方式,一个map包含了key与value两个值。首先需要对两个值进行赋值,然后对map执行insert操作,简单代码如下: 注意在map中,key值是

    2024年02月15日
    浏览(48)
  • VS2022迁移VS2019项目遇到的.Net Framework 引用程序集问题解决方案

    在GitHub上发现TrafficMonitor的开源代码,想要自己过一遍这个项目 在VS2022上面打开出现了MSB3644错误,打开微软 “找不到项目所请求 .NET 版本的 .NET 引用程序集时,会发生此错误。 发生此问题的原因可能是项目文件存在问题,它所请求的版本无法识别或未安装;也可能是安装问

    2024年02月06日
    浏览(109)
  • 关于js中for...in循环对象时,输出key值顺序混乱问题

    当循环纯数字索引对象时,循环key值是正确的 当对象变为复杂对象时,输出的key就变得复杂 ES6之前,循环对象常见做法是使用:for…in。但是for…in循环的问题在于它会遍历原型链中的属性,所以需要使用hasOwnProperty执行检查属性是否属于该对象。 ES6之后,我们对于对象的循

    2024年02月14日
    浏览(42)
  • 关于Qt程序打包后运行库依赖的常见问题分析及解决方法

    目录 一. 大致如下常见问题: (1)找不到程序所依赖的Qt库 version `Qt_5\\\' not found (required by (2)Could not Load the Qt platform plugin \\\"xcb\\\" in \\\"\\\" even though it was found (3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentation fault,或者I

    2023年04月17日
    浏览(58)
  • Redis解决Session共享问题

    session共享问题:多台Tomcat并不共享session存储空间,当请求切换到不同tomcat服务器时导致数据丢失的问题 tomcat可以进行多台tomcat进行session拷贝,但是数据拷贝保存相同的内容会存在资源浪费,而且会有时间延迟,所以这种方案不可行 session的替代方案应该满足: 数据共享 内

    2024年02月16日
    浏览(51)
  • 表白墙完善(数据库,前端,后端Servlet),再谈Cookie和Session。以及一个关于Cookie的练习小程序

    目录 表白墙引入数据库  再谈Cookie和session 得到Cookie ​编辑 设置Cooie 使用Cookie编写一个登入的小界面 1.先引入数据库的依赖(驱动包),5.1.49 pom.xml中,在之前的两个之前,再去添加一个 2.创建本地的数据库 3.之前的代码中有一段可以删掉了 这个代码需要删除,因为我们已

    2024年02月08日
    浏览(57)
  • 关于微信小程序<web-view>组件跳转报错问题-解决!

    报错以上的问题 尝试了好久--发现的问题-官网上文章看完了也没有看到   当点击 itemClick1 的时候 就报以上的 错误 当点击 itemClick2 的时候就能成功 跳转 原因是:  itemClick1和当前跳转的位置是同级,应该是web-view组件不能跳转到同级以外的地方! 总结:  所有想要使用 web-view 组

    2024年02月16日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包