收藏
回答

【严重安全风险】“云调用直接获取开放数据”如果用户使用自己构造的参数调用,云函数无法验证用户数据?

文档位置:

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。



最后一次编辑于  2020-12-21
回答关注问题邀请回答
收藏

5 个回答

  • 周公子
    周公子
    置顶回答01-12

    你好,感谢反馈。目前开发者可以在云函数中通过以下代码获取到可信的开放数据 keys,进行数据校验。

    const wxContext = cloud.getWXContext()
    const openDataInfo = JSON.parse(wxContext.OPEN_DATA_INFO || "{}")
    console.log('openDataInfo', openDataInfo)
    // openDataInfo { keys: [ 'weRunData' ] } 
    
    01-12
    有用
    回复
  • 邓坤力
    邓坤力
    2020-12-16

    https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/utils/Cloud.getWXContext.html

    判断下是小程序端来源的调用,就保证是后台解的了

    2020-12-16
    有用
    回复 4
    • WhoTFAmI
      WhoTFAmI
      2020-12-17
      为什么是小程序端来源的调用就可以保证某个字段是后台解的而不是小程序传上来的?
      2020-12-17
      2
      回复
    • 毕方瑜
      毕方瑜
      2020-12-17
      无法保证的。都是 wx_client。见截图。
      2020-12-17
      1
      回复
    • 毕方瑜
      毕方瑜
      2020-12-21
      官方,看下这个例子啊。不然早晚出问题,立此为证:
      小张参照着文档(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。
      2020-12-21
      回复
    • 毕方瑜
      毕方瑜
      2020-12-21回复WhoTFAmI
      你是个明白人
      2020-12-21
      回复
  • 毕方瑜
    毕方瑜
    2020-12-15

    开发者必须避免直接在云函数中取用解密的数据,应该使用cloudID 通过调用 cloud.getOpenData 接口来,获取手机号。 建议微信赶紧把cloudID 自动解密删了吧,免得造就潜在安全问题!

    2020-12-15
    有用 2
    回复
  • π
    π
    01-10

    确实有这个问题,建议用 cloud.getOpenData 

    01-10
    有用
    回复
  • 老张
    老张
    2020-12-17

    谢邀。我感觉自己没活在同一个维度。没看懂。

    这里有什么安全风险啊?能举个例子?


    2020-12-17
    有用
    回复 4
    • 毕方瑜
      毕方瑜
      2020-12-18
      例子:
      小张参照着文档(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。
      2020-12-18
      回复
    • 老张
      老张
      2020-12-18回复毕方瑜
      不敢苟同,你去实践一下先。
      2020-12-18
      回复
    • 毕方瑜
      毕方瑜
      2020-12-21回复老张
      。。。 实践完了的
      2020-12-21
      回复
    • 老张
      老张
      2020-12-21回复毕方瑜
      https://developers.weixin.qq.com/community/develop/article/doc/0006a8ec7ac860c94bf90a34f5d813
      我的小程序里所有获取电话号码的代码都是这个云函数login,静待你来攻破它,攻“课博”这个小程序吧,课博小程序的云函数login,想知道你怎么做到黑掉这个云函数。
      2020-12-21
      回复
登录 后发表内容
问题标签