这两天大家的朋友圈应该都有被阿里巴巴安全部门开除几名抢月饼的员工这条新闻刷屏吧?这是知乎的传送门:如何看待阿里巴巴安全部门的月饼事件? 看了看评论,感觉这个可以上娱乐快报了。当然作为看官,或同情事主或支持公司这些观点咱就不讨论了啊,要是三观都能一致,世界早就和平了。
作为一名入门不久的前端,当我看到文中说他们用js脚本来写了定时器抢月饼时,我的好奇心被大大地激发了,心想折腾的东西也不少了,但还从来没做过这么能够提升自己效率的事儿,吓得我赶紧看了看抢票这些事儿的原理。如果不考虑后续事宜,只是想着点击抢购按钮那一下可以快人一步,事情倒是真的不复杂。
然而这两天看到了好多不管是媒体还是自媒体站出来用“世人皆浊我独清”的态度、使用骇人听闻的标题如“开除TA不是因为月饼”、开始大肆宣扬开除他们是因为他们漠视规则破坏规矩、利用漏洞实施攻击、监守自盗知法犯法云云。对于他们我只想弱弱问一句:你们知道用js抢月饼是怎么一回事么?
上菜
以qiang.taobao.com为例子,用我薄弱的基础和拙劣的语言尽力描述。
在开始抢购之前,显示的是即将开始的倒计时代码,正常购买代码被隐藏,可以和正常购买的代码对比下,该部分div.tb-action.tm-clear
是完全一样的,那么也就意味着我们可以提前选好要点击的dom元素,当然了,他这个禁止购买绝不仅仅是前端页面的将其功能隐藏,后端也是有很多限制啦。
那么我们可以每隔一段时间比如5s去看一下是否快到抢购时间了,如果快了,就改用高速的循环去点击抢购按钮,当然开始之前点击按钮的请求会是失败了,但是抢购开始的时候我们可以很快的点中,将代码写到开发者工具的console中回车即可。代码如下:
function panicCakes(){
console.log("panic mooncakes");
document.getElementById('J_LinkBuy').click();
}
//以抢下午5点的为例,很多情况就没有再考虑
var deadline=new Date(2016,8,14,17,0);
var panic=null,diffs=null;
var t=setInterval(function(){
var now=new Date();
console.log(deadline)
console.log(now)
var diffms=deadline.getTime()-now.getTime();
console.log(diffms)
if(diffms<5001){
console.log("开始加速...")
panic=setInterval(panicCakes,50)
}else{
diffs=diffms/1000;
console.log("剩余"+parseInt(diffs/60)+"分"+parseInt(diffs%60)+"秒")
}
},5000)
我们上边主要做的事情其实就一件,就是利用代码自动触发click()事件,省了人工去手动点击抢购按钮这件事,针对淘宝来说,点击购买之后只要成功就跳转到了提交订单页面,所以不仅不用考虑什么时候清除定时器,我们的所有代码都没用了,到目前为止这对任何人不会有什么风险或者威胁。当然了想要一个完整的直到成功提交订单的刷票代码就没那么简单了,可能需要解决:突破层层验证(现在我没有考虑)、如何在页面跳转之后仍然可以自动执行代码,这个我继续努力吧。
鉴于我这个菜鸟和阿里员工之间的差距肯定不止十万八千里,而我又恰好不惮以最low的方法去揣测他们的实现方法,所以有什么出入,那真的是再正常不过的事情,况且我这儿只是抢的第一步,后边的各种验证都没有考虑,所以这个题目可能是耸人听闻了一些。。。写下这些只是为自己记录下、顺便为不懂技术的朋友们提供一点或许可以提升效率的方法。
写在最后
本来还想写一些攻击的主要表现形式,但是发现说清楚还挺难。基本的前端攻击涉及XSS,csrf,网络劫持等,这些留着后边几天再写吧。