
这两天,QQ上收到有用户向我反馈,在精武堂游戏内频繁被挤掉线,为此我专门对家园登录账号和QQ登录家园的程序进行了优化,当用户登录时系统会自动刷新用户的sid。
本以为该问题已解决,没想到今天该用户继续反馈了该问题。
由于我们的系统中有websocket长连接,只要同一个用户先后触发登陆操作,就会把第一个建立的长连接踢掉,并且提示重复登录。
我首先想到的就是这个用户的账号可能分享给其他人了,然后两个人同时用一个账号在登录家园,但是互相不知道。
然后,我就查询我们用户的访问日志,发现确实有两个在短时间内(确切的说是同一秒内)有两条登录请求的日志,这两条登录请求的来源ip还不是同一个。
我们的登录验证是基于签名验签机制做的,将所有请求参数(包含时间戳参数)拼接成字符串,然后对着字符串进行签名,但是这两条登录请求的签名参数是一致的,那就只有一种可能了,用户1登录完成瞬间把请求参数拷贝发给用户2,让用户2也做一次登录请求。
常理告诉我们,人工是做不到这么快的速度的,那么就剩下了两种可能,要么是用户的设备中病毒了,将用户的请求数据拦截,然后重放;要么是我们服务器中毒了,发生到我们服务器的数据被拦截,然后重放。
问题很棘手,服务器发生中毒的概率应该是很低的,黑客攻破了服务器,还不勒索我们,那也太仁慈了,所以我怀疑是用户端的问题。
先从导致用户重复登录的那个请求ip顺藤摸瓜,不查不知道,一查吓一跳,竟然这个请求ip在我们系统中出现频率这么高,而且日志中显示所有使用这个ip进行请求的用户都被重复登录了!我晕,真是悲剧了,难道最近互联网中出现了一种很牛掰的木马,用户全都中招了?
接着往下分析,咦,为啥使用这个ip请求我们系统的用户,在第一次登录成功的时候,都是使用的QQ浏览器呢?
难道是QQ浏览器在搞鬼?于是开启 fiddler 开始抓包,不抓不知道,一抓吓一跳。原来在QQ浏览器中每次访问链接都会做上报。
看样子腾讯QQ浏览器的运营团队将地址上报之后,就可以在腾讯的后台访问一遍,继而判断当前链接中是否含有非法内容了,实在是高!
这样就能解释我们的用户为什么会重复登录了,大体上分为下面几个步骤:
1.用户请求一遍我们的登录链接;
2.QQ浏览器将这个链接上报;
3.QQ浏览器在腾讯后台又访问了一遍这个网页;
4.用户被报重复登录了,所以在精武堂内出现了掉线的情况。
其实这个问题比较隐蔽,第3步当QQ浏览器的后台访问上报链接这个步骤,不是每次都会触发的,这也很合理,如果每次上报都访问一遍,就是一个ddos黑客攻击了。
这一次面临的问题比较棘手,目前正在紧急尝试各种修复方案,不过即使我们这次修复了,QQ浏览器后台一变规则,我们的修复就得从头做,不说了,说多了都是泪啊。还好腾讯是一家国内的公司,如果在欧盟,估计早就赔个底朝天了。





















