GET请求不安全的解决办法

此前在做一个项目时遇到GET请求路径被截获后引发项目组的担忧,此后通过文章所介绍的方法做了有效处理。

先描述下问题,我们公司给客户开发项目,要用到微信公众号,然而公众号是由第三方公司维护,所以我们做微信的网页授权

想获得用户的openid ,就必须请求到第三方,第三方代替我们做网页授权,最后第三方再把微信的openid 通过GET方式传给我们,问题恰恰就出现在最后的GET请求上。例如,GET路径是这样的,http://aaa/bb.do?state=abc&openid=123; 测试人员A在页面请求未结束的时候点击手机右上角的“...”按钮,然后复制链接,把链接发给B,在B的手机上打开刚才复制的链接,结果B看到的是A的页面信息,这就给系统带来很大的威胁,因为GET请求就会把参数追加到路径后面。

解决办法: 

这是网页授权的原始路径:

String auth1 = https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=http://aaa/bb.do?state=abc&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

在向微信请求这个路径之前,生成一个uuid的唯一值,并把这个uuid的值作为redis 的key ,存到redis中,设置过期时间

String tgc = UUID.randomUUID().toString().replaceAll("\\-", "").toLowerCase();

redisStringCli.set(tgc, "abcd", 120);

将这个tgc参数追加到授权路径上,让微信重新返回来,接收到这个参数后,将它从redis 中删除,那么即使把链接(http://aaa/bb.do?state=abc&tgc=tgc&openid=123)复制给B,B访问后验证redis中是否存在该tgc ,如果不存在说明不是本人操作而可能是链接被盗用,并重走授权,那么获取的openid 就是B的,而不再是A的,打开的也是B的页面信息,这样就解决了链接被盗用的威胁。

String auth2 = https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=http://aaa/bb.do?state=abc&tgc=tgc&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

验证tgc:

String tgc = request.getParameter("tgc");
    if(StringUtils.isBlank(tgc))
return ErrorPresent.toErrorPage(model, "系统异常,请稍后重试");
if (!redisStringCli.exists(tgc)) {
//重新走一次授权
String forward = auth1;
return "redirect:"+forward; 
}
redisStringCli.del(tgc);

String openId = request.getParameter("openid");


你可能感兴趣的:(GET请求不安全的解决办法)