原諒我不厚道的標題黨了。不過我可沒有亂說吹牛哦。
起因:看到前公司的同事轉發的營銷活動,感覺很棒,臨時起意玩了玩.. 然后自己想了想是怎么一些東西是怎么實現的,發現并不是那么嚴謹,所以就當友情測試啦。
這是游戲的主要的界面

有必要說下游戲規則:是根據取得分數來進行抽獎,88分以上獲取二等獎的抽獎機會(什么微波爐啊啥的),108分以上獲取一等獎(AI手環),,分數前12名的獲取直飛俄羅斯免費全程世界杯門票的機會, 哈哈 甲方可是花了大價錢啦。
說了游戲規則,可以看出,主要是游戲的分數,分數夠了就能抽獎了,但是這個分數是**客戶端計算**的,有句俗話叫永遠不要相信前端,就是這個道理了,前端一切都可以是假的。
然后想著看看代碼,攔截包修改下中轉發出去,找找接口啥的,結果發下直接打開微信開發者工具,這里有一個很嚴重的問題,我一個用戶居然能在微信開發者工具里打開頁面,雖然報錯也沒有用戶信息,但是沒關系,至少能看看代碼嘛,都不用我攔截改包了,直接就在調試哪里執行我像執行的代碼了。

這里代碼就不貼了,密密麻麻看著就眼花,直接把關鍵的提交游戲分數的接口貼出來,如下圖

可以看到,更行分數的接口很簡單,一個post請求,帶兩個參數,一個是分數,一個是access_token, 分數不過數字隨意填寫,access_token如何獲取呢,我想了很久因為也查看不了,調試工具里access_token是什么鬼,懂的可以略過是空的,根本沒有我的登陸信息。
~~~
這里插一句,access_token是什么鬼,懂的可以略過,游戲中服務器何拿到用戶id?
首先我們來說說如何實現微信登錄,其實微信登錄的api很簡單,就是wx.login,在success的回調中,你會拿到一個code,這時候,你要拿著這個code去請求后端,得到返回的openid,這個openid就相當于用戶id了。至于后端的邏輯我們稍后再說,這里先說說openid。每一個微信用戶都有一個openid,它們是一一對應的關系,但是openid并不是微信號,因為微信號這種信息,騰訊是不會給你的。
現在說說后端拿到code之后,怎么處理,其實很簡單,后端拿到code之后,將它連同appid和appsecret一起作為參數,請求jscode2session接口獲取用戶的openid,注意,code只能用一次。這里接口會返回openid和sessionid,很明顯,sessionid是微信的sessionid,并不建議保存到客戶端,所以這里我們一般會做一個處理,我們會把我們自己服務器的sessionid和openid做一個映射放到緩存,然后將自己服務器的sessionid和openid返回。
如何獲取用戶信息?
用戶信息其實是在另外一個接口中,叫做wx.getUserInfo,在回調中,你能夠獲取到用戶昵稱、用戶頭像、用戶性別、用戶城市、省份、國家6個信息。那么有人就要問了,既然這里就能夠獲取到用戶信息,那么為什么還要去用wx.login獲取什么openid呢?原因很簡單,因為wx.getUserInfo獲取到的6個信息,沒有一個能夠用來作為id,用戶的昵稱可能是重復的,用戶的頭像地址也可能是會變化的。所以這里我們要把之前獲取到的openid和這里的信息結合起來,形成一條用戶記錄,推到數據庫。
~~~
大家我們知道,微信PC端和手機端是通的,一樣玩游戲獲取授權等像關系信息,所以我們可以考慮抓微信的包,把access_token給抓出來,這個值肯定是加密過的但是沒關系啦,我們并不關心內容也不需要去解密,只要要抓出來原樣帶上請求就好.接下來我們來考慮抓微信的數據報。
至于抓包我一個反應是wireshake,相信學網絡工程的同學絕對很熟悉,但是這個玩意兒太去全了,一股腦什么包一個不漏的給你抓出來,看的眼睛花,所以我么考慮用Fiddler,這個玩意兒可以更加針對web的包。
http://www.66868.com/pc/9886.html Fiddler然后安裝,
安裝好是這個樣子的

接著打開微信PC端,然后開始抓包,然后打開我們的踢足球游戲的頁面,就能抓到微信的包啦,如下圖。(嗎的,差點裝了一個全家桶在電腦上)
成功抓取到access_token:如下

這個時候就簡單啦,吧這個token復制到另一邊附帶上請求就行了,我們來試試,

可以看到 我們執行成功了,但是我在執行的的過程之前測試的時候 ,短時間內請求太多次被后臺檢測到了,所以被封禁了,不過沒關系等到明天就好了。又可以繼續浪了,至于數字想填寫多大填寫多大。
執行成功后,會返回一個gameId,我們在用gameid 加上token去請求開寶箱的接口就能實現無腦抽獎,總會中了。有些晚了,就寫到這里吧。
總結一下:
1.在重要的場景不應該相信前端的計算
2.沒辦法只能前端處理分數等邏輯務必配置好代碼,讓除了自己團隊之外的開發者無法在微信開發者中打開,無法獲取到代碼。
3.即使我無法進行微信開發者看到玩個 無法抓微信包的token,但是我本機抓包,攔截改包后再發出去,一樣OK,更加簡單粗暴,所以上https。
后記:
1、俄羅斯世界杯門票,分數是夠得,但是沒敢去領,后來有其他同事分數前十的確獲得了去俄羅斯看世界杯的資格,打電話給同事告知之后,也沒有在關心。
2、在我明確告知了我前領導(朋友)我的分數是自己通過作弊手段得到后任然收到了一個格蘭仕的光波爐,應該是感謝我是友情測試吧,哈哈哈哈哈哈
- 以專業工程師的標準要求自己
- JS
- 函數的this
- 函數的argument
- 函數的apply、bind、call方法
- 創建對象
- 構造函數創建對象
- 原型結合構造函數創建對象
- 原型
- 繼承
- 閉包
- 正則表達式
- Ajax
- 設計模式
- ES6
- es6的模塊化
- 定義變量的新方式
- 函數擴展
- 數組擴展
- 性能與工程化
- 關于http與緩存
- 重排(reflow、layout)與重繪
- 頁面性能
- gulp
- webpack
- 一些項目回顧總結
- 移動端&微信H5游戲
- 微信小程序
- Vue.js
- 隨手記錄
- 如何通過前端技能獲取2018世界杯門票
- jsonp
- es6 javascript對象方法Object.assign()
- 一份不錯的基礎面試題
- vscode常用插件
- koroFileHeader
- 構建自己的Js工具庫
- H5 game
- Phaser從入坑到放棄再入坑
- 1.游戲的創建
- 2.資源的加載
- 3.phaser中的舞臺,世界和攝像機
- 4.游戲縮放控制,移動端的適配
- 5.phaser中的顯示對象
- 1.概述
- 2.phaser中的圖片,圖形,和按鈕
- 3.phaser中的精靈
- 4.文字
- 5.組
- 6.phaser中的動畫
- 7.粒子和瓦片地圖
- 8.瓦片地圖
- lodash
- ES5 to ESNext?—?here’s every feature added to JavaScript since 2015
- 防抖(debounce) 和 節流(throttling)