Wechat-Group / WxJava

微信开发 Java SDK ,支持包括微信支付,开放平台,小程序,企业微信,视频号,公众号等的后端开发
Apache License 2.0
29.66k stars 8.53k forks source link

获取登录后的session信息方法容易出现敏感信息泄露问题 #3245

Closed thx125 closed 5 months ago

thx125 commented 5 months ago

提问前,请确保阅读过项目首页说明以及wiki开发文档相关内容,尤其是常见问题部分。完成内容后,请务必移除包括本句在内的无用内容,以免影响阅读,否则直接关闭,谢谢合作~

另外如果确认属于bug,而且已明确如何修复,请参考贡献指南直接提交PR,省的浪费时间在这里描述问题,非常感谢配合

简要描述

请简单概括描述下你所遇到的问题。 如果code传入的参数带了双引号,容易出现信息泄露的问题

模块版本情况

详细描述

尽量详细描述。请不要使用截图,尽量使用文字描述,代码直接贴上来,日志则请附在后面所示区域。

try {
    String code = "\"abc\"";
    WxMaJscode2SessionResult sessionInfo = wxMaService.getUserService().getSessionInfo(code);
} catch (WxErrorException e) {
    throw new ServiceException(e.getMessage());
}

返回的异常信息包含了敏感信息,appid/secret Illegal character in query at index 203: https://api.weixin.qq.com/sns/jscode2session?access_token=78_39Cluk4uNHTSZnzABRbQrhucnwdsmwag343eOQphAgHzNphgo7e-0pWqeM_13vb8KpU-lBU5Z_UQFPY4fOfup3cazDT1-ljf_jT5_ShgCyJoXNiImGprQ8eztuwKCBfAIADVU&js_code=\"abc\"&secret=f6e0e8465wer63dbb682da98370feff1e&grant_type=authorization_code&appid=wx5370c9jhg248e428

可以通过异常信息获取appid/secret

日志

如果日志不多,直接使用md代码引用格式贴在此处,否则如果太长,请将日志放在 pastebin 或者其他地方,然后将其url地址贴在这里

日志请写于此处
binarywang commented 5 months ago

欢迎直接提供优化代码,谢谢

thx125 commented 5 months ago

可以将jsCode进行URLEncoder加密一下处理

public abstract class BaseWxMaServiceImpl<H, P> implements WxMaService, RequestHttp<H, P> { 
    // 省略
    public WxMaJscode2SessionResult jsCode2SessionInfo(String jsCode) throws WxErrorException {
        WxMaConfig config = this.getWxMaConfig();
        Map<String, String> params = new HashMap(8);
        params.put("appid", config.getAppid());
        params.put("secret", config.getSecret());
        params.put("js_code", URLEncoder.encode(jsCode, StandardCharsets.UTF_8));
        params.put("grant_type", "authorization_code");
        String result = this.get("https://api.weixin.qq.com/sns/jscode2session", Joiner.on("&").withKeyValueSeparator("=").join(params));
        return WxMaJscode2SessionResult.fromJson(result);
    }
}
binarywang commented 3 months ago
        params.put("js_code", URLEncoder.encode(jsCode, StandardCharsets.UTF_8));

你这个只是将js_code编码了吧,并没有解决appid和secret泄露的问题吧,难道你的本意不是这个?