【转载】被踢出去的用户

0

在尚未掌握所有证据以前就下结论会犯严重的错误,会使判断带有偏见。——《血字的研究》前端

“齐识,路老板又来邮件了。”白娜一脸无耐地说。程序员

“必定没好事吧?”齐识回头看了一眼,手依旧在快速敲着代码,并无停。浏览器

“你刚从泰国回来?”齐识说到。缓存

“你怎么知道?”白娜瞪着眼睛一头雾水。她清明假期去泰国玩这件事,并无告诉任何同事。安全

“你脸明显比节前黑了,说明去了热带地区玩。你戴的耳环之前没看到过,说明是假期新买的。耳环上刻着大象……”,齐识停下敲代码的手,回过头,“说明你去了视大象为国宝的泰国。”服务器

“你……牛……,不愧是程序员名侦探……”。微信

“说吧,又出什么事了?”齐识回到显示器前继续敲代码。cookie

“仍是用户被踢出去的那个问题。”工具

“上次不是已经查清楚了吗?是低版本IE的锅。”测试

“但是,此次是IE 11……”

“哎——”齐识长叹一声,“好吧,把邮件转给我。”

“已经转给你了。拜托了,我去开会了哈。”

齐识很不情愿地将界面从IDE切换到网页,打开了邮件。这是一封几经转发的邮件,一开始是路老板的用户向路老板抱怨系统用着用着就自动登出了大家这什么烂系统,路老板回复说多是低版本IE的锅爸爸请考虑升级IE或换其余浏览器。客户说老子TM用的就是最新版IE你是否是在玩老子,因而路老板转发给项目经理白娜说今天必须解决不然炒了大家整个团队。最后白娜转发给齐识,只有三个字母:FYI……

很麻烦。这个问题之前也出现过几回,一直没有找到具体缘由。上一次时发现用户用的是IE 8,而当时系统支持的IE最低版本是9。当全部人都焦头烂额一筹莫展的时候,这位超级英雄背锅侠IE站了出来。果不其然当用户换了其余浏览器后,就再也没有出现过相似问题了。

但此次,背锅侠说这锅老子不背了。

齐识看了看表,上午11点。不知道要为这个问题加班到几点。

他先打开了日志分析工具,按照用户名查询与该用户有关的日志。永远不要相信一个不懂电脑的用户所描述的事实,全部的信息都要再次确认。但此次事实彷佛很无情无义无理取闹,这个用户用的确实是IE 11。

经过日志,能够看到这个用户全部的访问记录:他先是登陆系统,打开几个页面,而后到了文件管理子系统,找到某个文件夹,上传了一个文件,而后就登出了。若是用户描述属实的话,此次登出请求不是他主动触发的,是系统自动把他踢出去了。

“用着好好的,怎么就被踢出去了呢?”齐识自言自语道。

“怎么了大侦探,愁眉苦脸的。”老夏端着泡了枸杞的保温杯路过。如今是11点半,这杯应该是第三泡。老夏之前也是项目上的大牛,后来不知怎的,去了培训部专门作员工培训了。不过他时不时仍是会到研发部这边溜达溜达,从背后窥探一下别人的屏幕,指出代码上的一些问题,而后哈哈一笑扬长而去深藏功与名。

“用户又被自动踢出去了。”齐识说。

“又是那个问题?不是IE的锅吗?”

“看来咱们有可能冤枉IE了,此次用户用的是新版本IE,按理说咱们的前端是确定支持的,也在测试环境验证过无数遍了。”

“这就怪了。这几回出问题的用户,是否是都用的IE?”

“是的。”

“那就仍是IE的锅。”老夏吸溜了一口枸杞茶,走了。

他看似不经意的一句话,反倒提醒了齐识。他立马继续查询日志,找出几个用不一样浏览器的用户,他们的各类操做错落有致,最后的登出请求也并没有破绽。只有一些IE用户,他们的登出请求是在上传完文件以后发生的。难道是上传文件的后台接口出了问题?但不一样浏览器产生了不一样的行为,这现象又 不像是后台的事儿啊。齐识一看表,已经12点半了。得了,先去吃饭吧。

1

……权衡点滴证据,作出不一样的假设,把它们进行对比,最后再肯定哪几点是重要的、哪些是不真实的…… ——《巴斯克维尔的猎犬》

草草吃完,买了杯咖啡,齐识又坐到了电脑前。像这种线上问题,尤为是本地没法复现的线上问题,是他最喜欢的。定位这些问题的过程,就像是侦探在探案,从最初的案件出发,将看似毫无关联的线索逐一梳理过滤,那最终惟一的真相也会慢慢浮出水面。每到这时,齐识就会感受像是个超级英雄同样拯救了世界。这样的问题解决得多了,同事们给他起了个外号,叫“程序员侦探”。他倒也不介意别人这么叫他,反倒有点自豪。

但此次用户被踢出的问题,齐识前先后后处理过三次,都没法定位。按照目前系统的实现,用户自动登出多是由于网站的登陆cookie过时且SSO上的登陆cookie也过时,这时当某个请求到达后台时,会清空全部与认证有关的cookie并重定向到SSO的登陆页面。登陆cookie的有效期是20分钟,但用户抱怨的是刚登陆不久就被自动踢出,从日志上看也的确如此。因此“登陆cookie过时”的不在场证实至关完美。

另外的可能就是缓存挂了。每一个请求到达后台时,都会到服务器缓存中取出在用户登陆时存储的一个token,将之与请求所携带的cookie中的token比较,若是不相符就自动登出。之因此这样作是考虑用户的安全,将伪造或窃取cookie登陆的黑客拒之门外。若是存储或读取缓存失败,天然也会自动登出。齐识之前在读写缓存的地方加了很详细的日志,并没看到任何错误发生。“缓存”做案的可能性也不大。

最后一个嫌犯是心跳请求。网站前端每隔2分钟会自动向后台发一个心跳请求,若是服务器发现本次心跳与上一次心跳间隔时间超过3分钟,就认为用户已处于不活跃状态,自动将其登出。这么作也是为了用户安全,好比将全部网站页面关闭,3分钟后再次打开,将会自动跳转到登陆页面。若是心跳请求没有发送成功,下次请求到来时极可能已经超过了3分钟,就会把用户踢出去。心跳请求能够在Web服务器的日志中查到,每次请求都是成功的。因此,“心跳”的嫌疑彷佛也撇清了。

就在上一次处理这个问题时,齐识偶然发现请求日志里显示的UserAgent是网站不支持的IE 8。使用系统不支持的浏览器,任何诡异的事情均可能发生。当用户升级了IE或使用了其余浏览器后,问题再也不发生了。可是这一次,为何新版的IE也不行了呢?

如今,齐识的目光集中在了上传文件的后台API上。这是此次发现的新嫌疑人,不,还有IE,多是团伙做案。如今掌握的最新线索是,用户使用IE,无论什么版本,在上传完文件后,被自动登出。对于IE这种惯犯,不容易找出它的破绽,因此齐识决定先从API下手。

2

在没有事实做为参考之前妄下结论是个很大的错误。主观臆断的人老是为了套用理论而扭曲事实,而不是用理论来解释事实。——《波希米亚丑闻》

两个小时过去了,仍是没有任何进展。上传文件的API若无其事地待在那里,一脸蔑视地看着齐识。

“有新的线索吗?”老夏又端着保温壶过来了。如今是下午3点,壶里应该泡上了新茶。老夏喜欢在午餐后泡一壶酽茶。

“今天的普洱味道如何?”齐识问。

“不是普洱,是正山小种。”

“咦?红茶应该是周四泡的啊,今天周三应该是普洱才对。”

“这个嘛,忽然就想喝红茶了,呵呵。”老夏说完吐了吐茶沫。“你有不错的洞察力,老是能发现别人不太在乎的事情。但有时候,根据那些事实并不能推理出你的结论。有些事情之间的关联可能很偶然,并不具有规律性。”老夏微笑地看着齐识,“如今状况如何?”

“我如今在看上传文件的API。我发现每次用户调用完这个API以后就会被踢出去。”

“哦?有意思,这个API作了什么见不得人的事了吗?”

“并无。我已经检查了它和它所调用的全部方法,甚至还看了它自己的filter和全局filter,并无任何地方会清空cookie或者token缓存。只有清空这些才会自动登出。”

“对了,你是怎么发现调用完这个API后会被踢出的?”老夏接着问。

齐识调出了某个用户全部请求日志,定位到上传文件的请求。“你看,这个POST请求是上传文件,后面这些就是登出请求了,而前面的都是一些文件夹跳转的请求。这是其中一个用户的请求,这里还有其余用户。”说着,齐识又开了几个窗口,平铺在了显示器上。

“有意思。”老夏眯缝着眼睛紧盯着屏幕。“虽然他们都是上传完文件就被踢出了,但能肯定就是上传文件的API致使的吗?是每次上传完文件都会登出吗?”

“还真不是!”

“并且别忘了IE,只有IE才会踢出用户不是么?那就更能洗清后台API的嫌疑了。”

“对啊老夏,我怎么没有想到?”齐识茅塞顿开。

“就像我连续两周都是周三喝普洱周四喝红茶,你认为那是某种必然。但这是你的主观臆断。主观判断必定要有事实做为依据,不然就都是臆断。”老夏说着,拿起茶壶晃晃悠悠地走了。

“等等,老夏,别走啊,我须要你!”

“我还有事。”老夏回过头冲齐识眨了眨眼睛说,“等你再须要个人时候我天然会出现的。”

3

他的表情再也不那样淡漠,我看到他炯炯有神的双眼迸射出智慧和兴奋的光芒。——《格兰奇庄园》

齐识的目光又聚焦在了日志身上。若是用户真的在上传文件以后被踢出,必定能从日志中找到什么蛛丝马迹。齐识又换了一个留下的操做日志较多的用户,将日志按时间排好序。这个是登陆成功的请求,这个是进入文件管理子系统的请求,这个是进入某个文件夹的请求,这个是心跳请求,而后上传文件,成功了,而后跳转到其余文件夹,继续上传文件,又发了个心跳,看看离上次心跳的间隔,嗯,2分钟,没有任何问题。齐识点击进入了下一页日志。

又进入了另外一个文件夹,仍是上传文件,成功了,而后……就登出了。这里面必定有什么猫腻。

齐识揉了揉眼睛,将全部注意力都集中到这几行日志身上,仿佛要看穿这屏幕,看到屏幕那头的另外一个镜像的宇宙。

用户在15:32:26进入了第一个文件夹,15:32:45发送了第一个心跳请求,而后上传了第一个文件,15:33:20跳转到第二个文件夹,15:34:30上传第二个文件,15:34:45发送了第二个心跳请求,15:35:07进入第三个文件夹,15:37:48上传第三个文件,15:37:49,用户被踢出。

齐识目不转睛地盯着每一个请求的发送时间,忽然,他炯炯有神的双眼迸射出智慧和兴奋的光芒。用户在15:37:48上传第三个文件以前,丢失了一个心跳请求,这个心跳本应该在15:36:45发出来。

心跳怎么断了?若是是心跳断了,是必然会被踢出的,这样是解释得通的。但心跳怎么能断呢?齐识打开发心跳请求的JavaScript文件,就是一个简单的setInterval,没有什么特别的。是什么,让这个2分钟的轮询中止了呢?

老夏呢?老夏呢?这老家伙跑哪去了?他说过会在我须要的时候出现的,如今我须要你,可你人呢?我发现了重要的线索,已经锁定了嫌犯,如今就差证据了,就差证据了。

4

排除全部不可能,剩下的那个无论多难以想象,都是事实真相。——《四签名》

“老夏?他说今天要去幼儿园接孩子,提早下班了。”培训部的同事说。

齐识的一脸兴奋变成了一脸沮丧,他本想告诉老夏这个重要的发现,而后跟他一块儿找到问题的根本缘由的。但老夏他竟然提早下班走人了。

“你要有事,就给他打电话吧。”培训部的同事看齐识如此低落,就提醒道。

对呀,我怎么忘了这个世界上还有电话这么神奇的存在。齐识拨通了老夏的电话,没有人接。

“老夏,我有了重要的发现……”齐识把刚才的线索编辑成一条微信,发给了老夏。而后回到座位上接着分析。

用户前两次上传文件都没有问题,但是第三次就被踢出了。从时间轴来看,前两次进入文件夹后,都是很快便发出了上传文件的请求,惟独第三次,进入文件夹以后,停留了2分多钟才发出了请求。用户在干什么?进入文件夹后去喝茶聊天了?那样的话心跳没有理由断掉啊。

齐识启动IE,打开开发者工具,登陆本地的系统,进入文件管理子系统,打开一个文件夹。接下来该干什么?齐识发呆了几分钟,一个心跳请求发送出去了。他回过神来,点击上传文件的按钮,弹出了选择文件的窗口。上传哪一个文件呢?该死,电脑里没有PDF文件。这个文件管理系统只能上传PDF文件,而且作了文件头校验,直接改后缀名是不起做用的。因而齐识只好搜了一个TXT转PDF的在线转换工具,丢上去一个空的文本文件,获得了一个PDF。而后切回刚刚打开的系统,选择文件的窗口还开着。他找到转换好的PDF,点击按钮。而后,而后浏览器就自动跳转到了登陆界面……

什么?复现了?这怎么可能?这么轻易就复现了?发生了什么?

齐识又进入系统,上传刚才转换好的PDF,一切正常。

闹鬼了?齐识把刚刚全部操做的日志拿出来看,第一次上传文件——也就是失败的那次——的时间,比进入文件夹晚了2分多钟,比上次心跳请求晚了3分多钟。按照系统的实现,超过3分钟没有心跳请求,后台会认为用户已经不活跃,将其自动登出。也就是彻底复现了生产系统中用户的问题。而在此期间,齐识是去转换文件了。

齐识盯着日志,良久以后,哈哈哈哈地笑出了声。

5

经过搜索,齐识很快验证了本身的想法。在IE下,像JavaScript引起的alert窗口或file组件打开的窗口,都属于模态窗口,它们会阻塞全部主线程中正在执行的JavaScript代码。至于Chrome、Firefox这样的浏览器,打开的并非模态窗口,这也就是为何只有IE频繁报出相似的问题,其余浏览器则一直表现良好。当这种模态窗口一直处于打开状态时,心跳请求就被迫中断了,继而在上传成功后,被自动登出。

证据确凿,“凶手”就是你了!

必定要把这个消息告诉老夏。齐识拿起手机,看到老夏半个小时前的一条回复:是否是上传文件的窗口打开的时间太长了?

齐识不只震惊,更是钦佩得五体投地。他把刚才的通过,一五一十地发给了老夏。过了一下子老夏回复道:“哈哈哈,果真,是哪一个笨蛋用户打开了窗口3分钟都找不到文件?等等,不对,不是3分钟,是1分钟!”

“没错,因此问题出现得仍是很频繁的。”齐识又和老夏聊了几句,忽然想起来什么,就问:“老夏,你明明不姓夏,但是为何你们都叫你老夏呢?”

“呵呵,此次解决问题,或者叫探案的过程你感受怎么样?”老夏彷佛有点顾左右而言他,”我看前两天你桌上放着一本福尔摩斯探案集,想必也是个Sherlockian,那你必定据说过那句话吧?”

世界上没有真正完美的犯罪,其实真相一直就在咱们眼前,只不过尚未被发现。所谓推理,不过就是把重要的细节放大。

当齐识和老夏同时打出这句话时,两我的都笑了。

6

“那个,我之前作开发的时候,你们都叫我夏洛克”。

原文连接 https://insights.thoughtworks.cn/user-kicked-out/

相关文章
相关标签/搜索