背景
最近接觸到一個(gè)投票,怎么才能用技術(shù)的手段投票呢?這是我思考的問題。
Part 1
思考
- 直接通過抓包查看接口能不能通過直接訪問接口達(dá)到目的?
步驟
- 通過分享的鏈接抓取到投票詳情頁的
url =http://h5.thepage.cn/economicVote/detail.htmlcid=5a3371b85ab34500e2302574&vid=5a41f55c308cc6063331c901&type=yxlrw
現(xiàn)在我們拿取到詳情頁面,更方便操作。(直接訪問這個(gè)鏈接就可以進(jìn)行投票)
- 通過抓包工具抓取到投票的接口
http://cloud.thepage.cn/vote?cid=5a3371b85ab34500e2302574&vid=5a41f55c308cc6063331c901&userid=89E08C9B639B0BE3A3D8D75378D0C798&userinfo=%7B%22origin%22%3A%22wx%22%2C%22token%22%3A%2289E08C9B639B0BE3A3D8D75378D0C798%22%2C%22headimgurl%22%3A%22http%3A%2F%2Fwx.qlogo.cn%2Fmmopen%2Fvi_32%2Fw1GXda9T4TUic2oKiab8xlWU69xAlHYU0XwGT3oX5AqYicbyjiarDYJvSFQvkMOuogoQw1KOuthdePrImQtiaDt0LzQ%2F0%22%2C%22nickname%22%3A%22%E5%94%A7%E5%94%A7%E5%8F%BD%22%2C%22sex%22%3A1%7D&aid=5a33710f0c83b900cf376354&nonceStr=2supuuyfte×tamp=1514447634411&sign=FA677FD78F3F611FC62E76787B8916DC&_=1514447634413&callback=Zepto1514447626658
現(xiàn)在我們已經(jīng)拿到了投票的接口,試試我們能不能通過再次請求接口投票呢。

- 那么我關(guān)掉網(wǎng)頁可以再次投票嗎?答案是肯定的。(已修復(fù))
結(jié)論
- 直接通過抓包查看接口不能通過直接訪問接口達(dá)到目的,但是我們可以通過重新就讓網(wǎng)頁達(dá)到目的。
Part 2
思考
- 為什么直接訪問不行,那么而重新訪問頁面后就成功了?
步驟
- 研究發(fā)現(xiàn)在關(guān)掉后再次請求的過程中其實(shí)變化的只是其中的token,nonceStr,timestamp,sign。那么token,nonceStr,timestamp,sign是從哪兒來的呢?
nonceStr和timestamp解密
- 拿取網(wǎng)頁的js,查看頁面邏輯。在小超的幫助下其中一段代碼引起了我們的注意:
request: function(e, t, n) {
var i = Math.random().toString(36).substr(2, 10);
var r = (new Date).getTime();
a.nonceStr = i;
a.timestamp = r;
很容易能夠看出來nonceStr 是 生成十位字母加數(shù)字隨機(jī)數(shù)(所以可以猜想這個(gè)本生就是隨機(jī)的,后臺是不會做驗(yàn)證的)。
而timestamp就是現(xiàn)在的時(shí)間戳(后臺也不會驗(yàn)證)。
可以發(fā)現(xiàn)這2個(gè)參數(shù)是可以按照規(guī)則隨意修改的。
sign解密
- 繼續(xù)解密js,在小超的幫助下這極端代碼引起了我們的注意:
delete a.sign;
var o = this.asciiSort(a);
var s = md5(o).toUpperCase();
a.sign = s;
很明顯sign在最后應(yīng)用之前是有asciiSort方法生成,然后再做MD5轉(zhuǎn)換,而帶入方法的參數(shù)就是刪除掉sign字段的a。
asciiSort: function(e) {
var t = Object.keys(e);
t = t.sort();
var n = {};
t.forEach(function(t) {
n[t] = e[t]
});
var i = "";
for (var r in n) {
i += "&" + r + "=" + n[r]
}
i = i.substr(1);
return i
},
-
Bingo!
所以sign的加密方式,就是把a(bǔ)的sign字段刪除后,按照asciiSort方法排序后,MD加密并轉(zhuǎn)換為大寫。
現(xiàn)在就差token了
token解密
-
同樣這次在小詩,小彰和小奇的幫助下,了解了token生成的原理。
2.png 根據(jù)其判斷邏輯,其實(shí)這個(gè)token是通過微信接口返的code(這個(gè)其實(shí)是微信的授權(quán),類似返回的用戶令牌),然后再通過本地請求后臺接口/weixin/get,生成的。
從新打開頁面能夠投票,最關(guān)鍵是因?yàn)閠oken變化了。(其他3個(gè)我們都可以自行修改,而token是無法自定義的,它包含微信的驗(yàn)證和本身后臺的驗(yàn)證)
所以我們要完成投票,必須要獲取到token。
Part 3
突發(fā)
本來在研究了幾個(gè)小時(shí)的機(jī)制問題,突然發(fā)現(xiàn)在同一個(gè)賬戶的情況下token不再發(fā)生變化。已經(jīng)不能夠通過之前的方式進(jìn)行投票。
猜想:我們了解到其實(shí)token是有時(shí)效性的,也就是說,如果設(shè)置的時(shí)效性有一段時(shí)間,那么在一定的時(shí)間內(nèi),token是不會變化的。那么我們將不能通過變化的token來發(fā)起投票。
問題:那么我們能夠獲取到其后臺生成token的方法嗎?
答案:暫時(shí)是不行的。
雖然暫時(shí)不能夠通過其他方式投票,但是研究投票實(shí)踐的整個(gè)過程是快樂的?;ㄙM(fèi)少量的時(shí)間獲得一些收獲也是非常值得的。最后再次感謝:小彰,小奇,小超,小詩,小淼。
