早上到公司,ZH说他昨天搜了一下有哪些开源的建站工具,今天早上就有一个建站的QQ加他好友,随口说了句是不是你乱填QQ号导致的,然后就没管了。没想到,下午我去google婚纱如何打包,点开了一个婚纱摄影网站里的一篇文章,看到文章没什么用就顺手把浏览器标签页关了。在我关掉的那一瞬间,奇迹发生了,这家婚纱店的企业QQ申请加我为好友了,瞬间一身冷汗。然后就把这个问题抛给了大企鹅的PM贝贝同学,让他内部反映问题去。
再然后,ZH和我就开始了对这个网站的扒皮工作,最后结果就是:卧槽,黑科技啊!
这个黑科技干的事情是:网站拿到访问者的QQ号码,然后该网站的营销QQ去主动加用户为好友,从而增加转化率。
这个事情里设计几个相关方:
1、普通网民,访问网站的人,以下简称访客。
2、被访网站,以下简称网站。
3、技术提供者,普通的网站去开发黑科技拿QQ号代价有点大,所以就有了一个技术提供者,他开发完,让普通网站去嵌入他们的代码就行。这个技术提供者在自己的官网里写的自己的核心技术就是拿访客QQ号,看来是靠这个吃饭的,我们今天要扒的就是他们是怎么干的。以下简称技术提供方。
4、腾讯。
整体流程是这样的:
1、访客之前应该登录了腾讯的Web产品,例如QQ邮箱之类,或者至少登录过腾讯的Web产品。我们没有测试清空QQ域cookie的情况,理论上应该拿不到QQ号了。
2、访客访问网站,网站加载技术提供方提供的js代码。
3、该js代码通过某种手段拿到用户的QQ号。
4、把QQ号传给技术提供方的服务器,技术提供方再通过其他方式通知网站的运营人员(很大可能是自动的),运营人员再来添加访客的QQ好友。
5、拿到QQ号之后,把QQ号放到Cookie中,下次访客再来时就不会再拿一遍了。
这几步里面,第三步是核心,下面详细分析到底怎么拿到QQ号,分两种情况,一种是用户处在腾讯产品的登录态,另外一种是曾经登录过腾讯的产品。
第一种:
技术提供者的JS首先向腾讯的一些域名发起请求,其中有一个重点请求,这个请求是腾讯课堂的某个课程页,在这个页面html里有访客的QQ号,解析出QQ号上报就行。时间有限,没有找到发起请求和解析QQ号的代码,个人猜测是在flash里做的。
第二种:
大致相同,但是这种情况下用户并没有登录,所以第一种情况里的html中不会有QQ号,但是腾讯有一个登录页面,这个页面是会保存用户的QQ账号的,所以拿到这个页面,解析一下也能拿到QQ号。
根本上说,这个问题是腾讯某些产品的漏洞造成的,所以不知道我这个问题报过去,大企鹅又有多少程序员过不好年,哈哈哈哈。如果大企鹅修复了这个问题,那个拥有“核心技术”的技术提供方估计就更加过不好年了,木哈哈哈哈。
原本就不是正当手段,而且还这么骚扰用户,就别干这事了。
理论上说腾讯只要判断一下referer就能防住这事,但是技术相关方拿的都是基础页内容,基础页的referer好像不太好做限制,加黑名单还行,做白名单估计不行。还有一个方法,就是页面自己判断自己是不是在一个正常的浏览器里,以及自己是不是在iframe里,如果不在正常浏览器里或者在iframe里就拒绝加载任何东西。不过也不是万全之策,因为这个要js来判断,js都加载了,基础页早加载了,在第一种情况下貌似防不住。再有就是,基础页的html里不要出现访客的qq号,这样他就没得拿了,不过这么改起来,企鹅的码农兄弟真的就不用过年了。