更多全球网络安全资讯尽在E安全官网www.easyaq.com
背景
最近朋友圈很火的左右脑年龄测试小程序,参与测试的人数显示有2390万在测,不知道这个数据是实时的,还是累计的,不过也足以说明大家对类似测试的兴趣以及微信朋友圈的传播速度。
写这篇文章算是帮该小程序正个名吧,首先测试之后有两个结论:
1,该小程序左右脑年龄测试的结果并不是随机给出的;
2,一些大v公众号的文章应该是实习生写的,应该是没有进行测试就得出了“随机给出测试结果”这个结论。
过程
在朋友圈看到很多人都在用这个小程序测试,禁不住好奇也测试了一把,测试完之后感觉还挺准确的,发完朋友圈之后,在几个微信群里就看到了一段代码的截图,其中有段标红的关键代码是:
var ansrandom2=Math.ceil(Math.random()*10)
其中Math.ceil()函数是执行向上舍入,即它总是将数值向上舍入为最接近的整数;Math.random()函数是取从0至1之间的随机数,乘10以后就是取0到10之间的随机数。相关的2张截图:
回到正题,看完微信群中发的代码截图之后,没有看上下文,就觉得这个小程序测试结果应该是随机生成的,然后就发了个朋友圈吐槽被忽悠这个小程序给套路了,没想到的是现在要写这篇文章打自己的脸。之后看到很多大v、小v公众号也发了文章质疑这个微信小程序的测试结果是随机生成的,比如差评君、云头条。
仔细看截图中的代码发现ansrandom2参数值的代码片段前面有注释“显示底部广告”,并且在后段“输出测试结果“代码段并没有看到这个参数值跟结果的生成有直接关系,其中有关系的一个参数值是ansrandom,两个参数值是差一个数字2的。虽然截图中代码片段不全,根据注释等差不多就能知道很多吐槽文章中说该小程序测试结果是随机生成的,显然是错误的。可能很多写文章的人也没有进行测试,照抄加工写出的一篇文章吧,连代码片段截图都是微信群及朋友圈流传的那2张。
既然发现结果有可能不是随机生成的,实在忍不住就找了个在线的网站测试了一下,抓包并没有发现相关的js代码片段,结果生成也不是通过前端来处理判断的,抓包到的关键请求如下:
POST /api/quiz/answer HTTP/1.1 Host: cn.qinpiam.cn quiz_id=276&user_choice_list=%7B%221843%22%3A%7B%22id%22%3A5549%7D%2C%221844%22%3A%7B%22id%22%3A5551%7D%2C%221845%22%3A%7B%22id%22%3A5555%7D%2C%221846%22%3A%7B%22id%22%3A5557%7D%2C%221847%22%3A%7B%22id%22%3A5561%7D%2C%221848%22%3A%7B%22id%22%3A5565%7D%2C%221849%22%3A%7B%22id%22%3A5567%7D%2C%221850%22%3A%7B%22id%22%3A5571%7D%2C%221851%22%3A%7B%22id%22%3A5575%7D%7D&user_id=&csrfmiddlewaretoken=XeeJznpgdm8Q4GQGU8SAKeEJczFRC6iE&fr_token=
其中user_choice_list参数的值就是用户选择答案,该请求提交到服务端之后会获取如下请求回显:
{"result_wait": 3, "user_id": "anonymous:c1491c60-1eb3-44c8-b626-690aa7471d5c", "user_upload_img_url": "", "fr_token": "k8rXiLH8ZrWk2EOk", "hashed_ids": "OoLqdPzrsKzXal4G", "answer_id": 3068}
如图:
注意请求回显中的两个标红参数值,最终生成的结果查看url是由上图中标红的两个字段参数值拼接而成的,具体url:
http://cn.qinpiam.cn/f/PGEjb27Ofp2MdVNW/r/juVnk1szc7aTx2jo
user_choice_list的值不变,对该请求进行多次重放,发现生成的结果却是不一样的:
{"result_wait": 3, "user_id": "anonymous:c1491c60-1eb3-44c8-b626-690aa7471d5c", "user_upload_img_url": "", "fr_token": "k8rXiLH8ZrWk2EOk", "hashed_ids": "OoLqdPzrsKzXal4G", "answer_id": 3068}
{"result_wait": 3, "user_id": "anonymous:3ba1447a-d090-4161-a1a9-f9f89e3dcc72", "user_upload_img_url": "", "fr_token": "9OEKT70uujxAUR5Y", "hashed_ids": "6x01dNYpH0kybX7W", "answer_id": 3066}
{"result_wait": 3, "user_id": "anonymous:acfc6743-6e7a-46e8-9a04-bc2531105aa5", "user_upload_img_url": "", "fr_token": "hGYUipEqzoyFSSCO", "hashed_ids": "P3RBe3yOupgybLJr", "answer_id": 3122}
可以得出结论:该在线网站测试结果确实是随机生成的,结果并不是在前端代码中验证随机生成的,而是从服务端获取的。仅靠那段流传的js代码片段来吐槽小程序的结果,显然是有毛病的。一些公众号测试用的在线网站跟我测试用的在线网站应该是一样的,百度结果能搜到的就那么几个,并且得出的左右脑年龄结果截图跟我这篇文章中的截图是一样的,特点是有“YES”、“NO”这两个按钮,跟微信小程序中测试结果图是有明显区别的。差评君文章中用到的截图也是通过在线网站测试得出的结果,但是经过我的测试确实没有发现前文中的js代码片段。
正名
再看看微信中的小程序到底是如何生成结果的,虽然微信屏蔽了该小程序的扫码入口,但是可以通过搜索账号主体”实用心理测试大全“来进入,如图:
费了九牛二虎之力,成功抓到了小程序的请求数据包,涉及到的几个请求如下:
抓到的请求中用的域名跟"实用心理测试大全"这个小程序的账号主体介绍中的域名一致,如图:
抓到的该小程序涉及到的请求中有如下一个:
https://api10.menglechong.net/data/1249.json
访问可以查看到json文件的代码:
从上面两张图中可以看到,每道题目的答案都有对应的一个store分数,最终根据九道题目得到的分数总和的范围来得出结果和对应的分享用的图片,一共有6个结果。
最终结论
没有抓到微信小程序获取结果的请求,不知道是不是获取结果请求没有走http、https的原因,但是可以得出一个结论:该左右脑年龄测试小程序的测试结果并不是随机的;该小程序的代码中并没有流传的两张图片中的代码段。小程序的测试结果年龄数字是写死到json文件中的,而前文中多个公众号引用的那个代码片段图中年龄是获取的result[index].name.one的参数值,说明那张前端代码截图跟该微信小程序是没有关系的。
根据这次的事情,吸取的经验教训就是不要轻易下结论,很容易导致自己打自己的脸,另外就是大v们写的文章也不一定是权威的。
本文转自公众号:聚沙安全黑板报
▼点击“阅读原文” 查看更多精彩内容