技術人玩小遊戲,如何“不戰而勝”

雖然遲了一天,但還是祝各位小夥伴端午安康。

最近因爲端午節到來,物業舉辦了一個網頁小遊戲,得分最高的前 N 名可以拿到獎品。

閒來無事的我參加了一下,發現自己實在是太菜了,總是玩不過別人,於是轉變思路,研究看看這個小遊戲是如何提交分數的。

抓包

通過 Charles 進行抓包,發現遊戲結束時會調用 commit 接口提交分數。那這就好辦了,因爲我們可以利用 Postman 僞造請求,從而達到 “不戰而勝”。

如果想了解如何抓包,可以在評論區留言,有需要的話再寫一篇抓包教程。

接口分析

抓包知道哪個接口還遠遠不夠,因爲接口最重要的還是請求參數,所以我們需要弄清楚每個參數的代表的意思,一般可以參數名可以猜出來。

特殊參數

一個特殊的參數 sign,這個參數是簽名的意思,由其他參數計算得到,作用是防止請求參數被篡改。因爲參數發生變化,計算出來的簽名也是不同的。服務端經過相同的計算,可以校驗參數與簽名是否匹配。

因爲 sign 是計算得到的,我們僞造請求同樣需要計算 sign,那麼就要知道簽名算法,如何知道?我們只能通過網頁源碼查看。

現在的網頁源碼大部分都是經過打包工具壓縮混淆,我們想要閱讀是一件比較困難的事情。但是我們只需要看提交分數的部分即可,如何快速定位代碼位置?答案是通過搜索字符串來定位。

打包工具混淆代碼只能修改變量名,而字符串是不能被混淆的,我們通過字符串搜索就可以稍微快速找到對應位置的代碼。比如通過接口名 'commit'、參數名 'sign' 進行搜索,查看簽名算法的邏輯。

請求頭

很多人僞造請求,都不注意請求頭的參數。例如 User-Agent 用戶代理,即用戶使用的瀏覽器標識、Cookie 一般會攜帶用戶信息,用於區分用戶。

既然要僞造請求,那就要僞造的真實一點,將抓包中顯示的請求頭都複製到 Postman 中(Content-Length除外)。

發起請求

一切都準備就緒,那麼就可以開始利用 Postman 發起請求。因爲涉及簽名計算,我們可以利用 Postman 提供的 Pre-requset Script 編寫請求前的計算邏輯,並將計算結果寫入環境變量中,然後再使用 {{}} 進行取值。

sign 保存到環境變量中

pm.environment.set('sign', sign);

變量的使用


到這裏就可以發起請求了,從而達到 “不戰而勝” 的效果。當然了,這種做法破壞了遊戲的公平性,是不可取的。不過我們可以從中吸取經驗,多思考問題,提升自身的技能。

思考

換位思考一下,假如這個小遊戲是我們自己開發的,那麼請你思考這幾個問題。

  1. 我們的應用該如何提高安全性,如何防止源碼被輕易解讀?
  2. 我們如何去發現識別這類僞造請求?

歡迎評論區留言討論,也可以 wx 搜索 fe_develop6 一起在羣裏學習討論。最後別忘了關注我,點贊來一波哦~

注意事項

  1. 該方法並不適用所有遊戲,請自行分辨;
  2. 本文僅供學習,如產生不良後果,本文概不負責;
  3. 轉載請標明出處 技術人玩小遊戲,如何“不戰而勝” @前端develop。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章