文档位置:
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#method-cloud
问题描述:
根据文档描述,小程序端获取到cloudID后,将cloudID传给云函数,云函数会自动将cloudID替换为解密后的值。
如果用户按照解密后的数据结构构造参数调用云函数,云函数无法判断收到的数据是否是由cloudID解密而来。
举个例子:
小张参照着文档(https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#method-cloud)
写了如下代码,来获取用户手机号:
////// 前端 ////////
wx.cloud.callFunction({
name: modifyPhone,
data: {
phoneCloudID: wx.cloud.CloudID(xxx)
}
})
//////// 云函数 ///////
exports.main = async (e) => {
// 获取解密后的手机号,但是无法保证这个数据不是伪造的!
const phone = e.phoneCloudID.data.phoneNumer
}
小黑可以这样手动构造参数,来欺骗小张写的modifyPhone云函数:
wx.cloud.callFunction({
name: modifyPhone,
data: {
phoneCloudID:{
cloudID:"11111111",
data:{
phoneNumber: "17777777777"
}
}
}
})
到此小程序就认为小黑的手机号为17777777777。
你好,感谢反馈。目前开发者可以在云函数中通过以下代码获取到可信的开放数据 keys,进行数据校验。
const wxContext = cloud.getWXContext() const openDataInfo = JSON.parse(wxContext.OPEN_DATA_INFO || "{}") console.log('openDataInfo', openDataInfo) // openDataInfo { keys: [ 'weRunData' ] }
https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/utils/Cloud.getWXContext.html
判断下是小程序端来源的调用,就保证是后台解的了
小张参照着文档(https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#method-cloud)
写了如下代码,来获取用户手机号:
////// 前端 ////////
wx.cloud.callFunction({
name: modifyPhone,
data: {
phoneCloudID: wx.cloud.CloudID(xxx)
}
})
//////// 云函数 ///////
exports.main = async (e) => {
// 获取解密后的手机号,但是无法保证这个数据不是伪造的!
const phone = e.phoneCloudID.data.phoneNumer
}
小黑可以这样手动构造参数,来欺骗小张写的modifyPhone云函数:
wx.cloud.callFunction({
name: modifyPhone,
data: {
phoneCloudID:{
cloudID:"11111111",
data:{
phoneNumber: "17777777777"
}
}
}
})
到此小程序就认为小黑的手机号为17777777777。
开发者必须避免直接在云函数中取用解密的数据,应该使用cloudID 通过调用 cloud.getOpenData 接口来,获取手机号。 建议微信赶紧把cloudID 自动解密删了吧,免得造就潜在安全问题!
确实有这个问题,建议用 cloud.getOpenData
谢邀。我感觉自己没活在同一个维度。没看懂。
这里有什么安全风险啊?能举个例子?
小张参照着文档(https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#method-cloud)
写了如下代码,来获取用户手机号:
////// 前端 ////////
wx.cloud.callFunction({
name: modifyPhone,
data: {
phoneCloudID: wx.cloud.CloudID(xxx)
}
})
//////// 云函数 ///////
exports.main = async (e) => {
// 获取解密后的手机号,但是无法保证这个数据不是伪造的!
const phone = e.phoneCloudID.data.phoneNumer
}
小黑可以这样手动构造参数,来欺骗小张写的modifyPhone云函数:
wx.cloud.callFunction({
name: modifyPhone,
data: {
phoneCloudID:{
cloudID:"11111111",
data:{
phoneNumber: "17777777777"
}
}
}
})
到此小程序就认为小黑的手机号为17777777777。
我的小程序里所有获取电话号码的代码都是这个云函数login,静待你来攻破它,攻“课博”这个小程序吧,课博小程序的云函数login,想知道你怎么做到黑掉这个云函数。