嗨!大家好,我是小蚂蚁。
如果你之前看过我写的与云开发有关的系列教程,并且在自己的游戏中进行了应用。那么,这几天将会在小程序的后台看见如下的通知。
这是一个关于 session_key 安全问题的通知,简单的解释一下,这个 session_key 是一个会话的密钥,用于保证小程序和服务器之间的内容传输的安全,例如当你想获取到用户的某些开放数据时,必须使用这个 session_key 对传输的内容进行校验和解密。
之所以收到这个通知,是因为在请求或者响应的数据中包含了“session_key”的明文,啥叫明文呢?就是如果这个传输的数据被其他人截取的话,就可以直接从数据中看到“session_key”的字样,就很容易得到这个“session_key”。就好像你在自己的行李箱密码锁的旁边挂上了一张写着密码“123”的牌子,让人一看便知。
官方的建议是如果你要使用这个“session_key”,就需要对其进行加密和解密处理,这样别人即使获取到了传输的数据,也很难得知其中的内容。就好像你还是在自己的行李箱密码锁旁边挂着一张写着密码的牌子,只不过牌子上写的不是“123”,而是“你大爷”,当然只有你才知道“你大爷”解密之后是“123”。
在你的小程序的通信过程中明文传输了“session_key”,这个会带来很大风险,所以你要进行修改以消除这种风险,这就是这则通知要告诉我们事情了。
但是,回顾了我的小游戏中对于云开发的使用,好像从来没有用过这个“session_key”,那么,这个到底是在哪里被传输的呢?
本来通过“登陆凭证校验”,我们只需要获得 openid 就可以了。但是在云函数中我将整个返回值(其中包含了session_key)的 JSON 都传回给小程序端了,所以就导致了返回的内容中包含了明文传输的“session_key”。
修改起来也很简单,我们只需要修改一下对应的云函数(login)即可,让它只返回一个 openid,不返回其它的内容。
const cloud = require('wx-server-sdk') const request = require('request') // 初始化 cloud cloud.init({ // API 调用都保持和云函数当前所在环境一致 env: cloud.DYNAMIC_CURRENT_ENV }) exports.main = async (event, context) => { var url = 'https://api.weixin.qq.com/sns/jscode2session?appid=你的APPID&secret=你的SECRET&js_code=' + event.queryStringParameters.code + '&grant_type=authorization_code'; return new Promise((resolve, reject) => { request(url, function (error, response, body) { if (response && response.statusCode === 200) { /*删除原来的这一行返回代码*/ //resolve(body); /*使用下面的这行返回,这里只返回我们需要的openid*/ resolve({openid:(JSON.parse(body)).openid}); } else { reject(error); } }); }); }
如图,需要修改的只有一行代码,将原来的返回全部内容的代码删掉,修改为只返回“openid”的代码。修改之后,保存一下你的云函数即可。
小游戏端无需修改,也无需更新,因为它依旧能够正常的获取到“openid”。
今天的内容就到这里了,如果你的小程序收到了这个安全问题通知,就尽快的去修改一下云函数(login)中的那句导致问题的代码吧!
我是会做游戏也会教你做游戏的小蚂蚁,想学习做游戏的话,关注我的公众号就对啦!

