Lidemy HTTP Challenge 全破流程與心得


Posted by i90681472a on 2021-05-11

依照關卡使用的 API 版本,這篇文章分為三個部分:V1(第 1~5 關)、V2(第 6~10 關)、V3(第 11~14 關)


V1

起點

https://lidemy-http-challenge.herokuapp.com/start
在起點的那一頁,就有解釋這個遊戲該怎麼玩,把網址後方的 start 換成 lvX,其中 X 是第 X 關的數字,後面接 token={第 X 關的 token} ,如果卡關,就在後面加上 hint=1,了解這些之後,就能開始遊戲囉。

第一關:GET

http://lidemy-http-challenge.herokuapp.com/lv1?token={GOGOGO}

啊...好久沒有看到年輕人到我這個圖書館了,我叫做 lib,是這個圖書館的管理員
很開心看到有年輕人願意來幫忙,最近圖書館剛換了資訊系統,我都搞不清楚怎麼用了...
這是他們提供給我的文件,我一個字都看不懂,但對你可能會有幫助:https://gist.github.com/aszx87410/3873b3d9cbb28cb6fcbb85bf493b63ba

先把這文件放一旁吧,這個待會才會用到
你叫做什麼名字呢?用 GET 方法跟我說你的 name 叫做什麼吧!
除了 token 以外順便把 name 一起帶上來就可以了

http://lidemy-http-challenge.herokuapp.com/lv1?token={GOGOGO}&name=yiluan

啊...原來你叫 yiluan 啊!下一關的 token 是 {HellOWOrld}

加上名字之後,就能看到下一關的 token 是 HellOWOrld

第二關:GET again

http://lidemy-http-challenge.herokuapp.com/lv2?token={HellOWOrld}

我前陣子在整理書籍的時候看到了一本我很喜歡的書,可是現在卻怎麼想都想不起來是哪一本...
我只記得那本書的 id 是兩位數,介於 54~58 之間,你可以幫幫我嗎?
找到是哪一本之後把書的 id 用 GET 傳給我就行了。

http://lidemy-http-challenge.herokuapp.com/lv2?token={HellOWOrld}&id=56

啊!就是這本書,太謝謝你了。下一關的 token 為:{5566NO1}

把 54~58 每一本都丟過去,就能嘗試到 56 是題目要的那本 id,拿到下一關的 token 5566NO1,5566 不能亡!!!!

第三關:POST

http://lidemy-http-challenge.herokuapp.com/lv3?token={5566NO1}

真是太感謝你幫我找到這本書了!

剛剛在你找書的時候有一批新的書籍送來了,是這次圖書館根據讀者的推薦買的新書,其中有一本我特別喜歡,想要優先上架。
書名是《大腦喜歡這樣學》,ISBN 為 9789863594475。

就拜託你了。
新增完之後幫我把書籍的 id 用 GET 告訴我。

用 POST 把書名:'大腦喜歡這樣學',ISBN:9789863594475 包在 form 裡面傳送 request ,會收到以下訊息:

{"message":"新增成功","id":"1989"}

接著再把 id=1989 傳到原本 lv3 的網址,會得到以下回覆,拿到下關的 token LEarnHOWtoLeArn:

這樣子讀者就能趕快看到這本新書了,謝謝!下一關的 token 為 {LEarnHOWtoLeArn}

題外話:我很推薦《大腦喜歡這樣學》以及作者的另外一本《給大人的人生翻轉學》,兩本書都很好看,尤其第一本會帶你了解大腦學習的方式,發散和集中模式、番茄鐘、間隔學習等主題,這兩本也都有各自的線上課程可以上,可以用上課的方式去吸收這些觀念。

第四關:GET 與參數

http://lidemy-http-challenge.herokuapp.com/lv4?token={LEarnHOWtoLeArn}

我翻了一下你之前幫我找的那本書,發現我記錯了...這不是我朝思暮想的那一本。
我之前跟你講的線索好像都是錯的,我記到別本書去了,真是抱歉啊。
我記得我想找的那本書,書名有:「世界」兩字,而且是村上春樹寫的,可以幫我找到書的 id 並傳給我嗎?

我原先的方法,是直接 get 所有的書本資料,再搜尋。但是到了後面的題目,這樣的方法會稍微麻煩一點,所以後來我改用 API 提供的 q: 查詢書籍 方式來操作,但不能直接丟中文給他,在 JavaScript 上的操作要再經由 encodeURI(中文字) 來轉換,才能收到。
也有可以線上中文字轉換的網站,就能直接在瀏覽器進行這個步驟。

從收到的回覆來看,會找到那本書的 id 是 79。下一關的 token HarukiMurakami。
http://lidemy-http-challenge.herokuapp.com/lv4?token={LEarnHOWtoLeArn}&id=79

沒錯!這次我很確定了,就是這本!下一關的 token 為 {HarukiMurakami}

第五關:DELETE

http://lidemy-http-challenge.herokuapp.com/lv5?token={HarukiMurakami}

昨天有個人匆匆忙忙跑過來說他不小心捐錯書了,想要來問可不可以把書拿回去。
跟他溝通過後,我就把他捐過來的書還他了,所以現在要把這本書從系統裡面刪掉才行。

那本書的 id 是 23,你可以幫我刪掉嗎?

用 DELETE 發完 request 之後,就會收到以下的回覆,得到下一關的 token CHICKENCUTLET:

{"message":"\n咦...是刪掉了沒錯,但總覺得哪裡怪怪的,算了,先這樣吧!下一關的 to
ken 為 {CHICKENCUTLET}\n"}

以上,使用第一版 api 的關卡(1~5)就結束了,接下來就進入到使用第二版 api 的關卡。


V2

第六關:http basic authorization

我終於知道上次哪裡怪怪的了!

照理來說要進入系統應該要先登入才對,怎麼沒有登入就可以新增刪除...
這太奇怪了,我已經回報給那邊的工程師了,他們給了我一份新的文件:https://gist.github.com/aszx87410/1e5e5105c1c35197f55c485a88b0328a。

這邊是帳號密碼,你先登入試試看吧,可以呼叫一個 /me 的 endpoint,裡面會給你一個 email。
把 email 放在 query string 上面帶過來,我看看是不是對的。

帳號:admin
密碼:admin123

這一題就需要用到 http basic authorization ,我上網找到用 Buffer.from(帳號:密碼).toString('base64'),把帳密轉換成Base64編碼,在 request 的 header 加上 Authorization: 'Basic 轉換成 Base64 的帳密',就會得到以下回覆和 email:

{"username":"admin","email":"lib@lidemy.com"}

在把 email 接在原本關卡網址後面,得到下一關的 token SECurityIsImPORTant。
http://lidemy-http-challenge.herokuapp.com/lv6?token={CHICKENCUTLET}&email=lib@lidemy.com

對對對,就是這個,這樣才對嘛!下一關的 token 為 {SECurityIsImPORTant}

第七關:DELETE again

http://lidemy-http-challenge.herokuapp.com/lv7?token={SECurityIsImPORTant}

那邊的工程師說系統整個修復完成了,剛好昨天我們發現有一本書被偷走了...
這本書我們已經買第五次了,每次都被偷走,看來這本書很熱門啊。
我們要把這本書從系統裡面刪掉,就拜託你了。

對了!記得要用新的系統喔,舊的已經完全廢棄不用了。

書的 id 是 89。

用第二版 api,request 帶著上一題的驗證 header,發出對 id=89 的 delete,會得到下一關的 token HsifnAerok:

{"message":"\n希望下一次進這本書的時候不會再被偷走了。下一關的 token 為 {HsifnAerok}\n"}

第八關:PATCH

http://lidemy-http-challenge.herokuapp.com/lv8?token={HsifnAerok}

我昨天在整理書籍的時候發現有一本書的 ISBN 編號跟系統內的對不上,仔細看了一下發現我當時輸入系統時 key 錯了。
哎呀,人老了就是這樣,老是會看錯。

那本書的名字裡面有個「我」,作者的名字是四個字,key 錯的 ISBN 最後一碼為 7,只要把最後一碼改成 3 就行了。
對了!記得要用新的系統喔,舊的已經完全廢棄不用了。

先用第二版 API 加上 q=encodeURI('我') 來找所有有「我」在書名的書本:

照原本四個字的作者,最後一碼 ISBN 是 7 的書,找到 id=72 的書,再用 patch 把更改最後一碼為 3 的 ISBN 傳過去,得到下一關的 token NeuN:

{ message: '\n希望之後他們能引進語音輸入系統,我就只要講講話就好。下一關的 token 為 {NeuN}\n' }

第九關:header 的 user agent

http://lidemy-http-challenge.herokuapp.com/lv9?token={NeuN}

API 文件裡面有個獲取系統資訊的 endpoint 你記得嗎?
工程師跟我說這個網址不太一樣,用一般的方法是沒辦法成功拿到回傳值的。

想要存取的話要符合兩個條件:

  1. 帶上一個 X-Library-Number 的 header,我們圖書館的編號是 20
  2. 伺服器會用 user agent 檢查是否是從 IE6 送出的 Request,不是的話會擋掉

順利拿到系統資訊之後應該會有個叫做 version 的欄位,把裡面的值放在 query string 給我吧。

在 header 加上 'X-Library-Number': 20,但 user agent 要怎麼變成 IE6?
查關鍵字 user agent ie 就會看到 MSIE X.0 的字樣,在 header 補上 'User-Agent':'MSIE 6.0' 就過了,就會得到包含 version 的訊息:

{"message":"success","version":"1A4938Jl7","owner":"lib","createdAt":"121290329301"}

帶回原本關卡的網址,加上 version:
http://lidemy-http-challenge.herokuapp.com/lv9?token={NeuN}&version=1A4938Jl7
得到下一關的 token duZDsG3tvoA 訊息:

限制這麼多都被你突破了,真有你的。要不要考慮以後來我們圖書館當工程師啊?下一關的 token 為 {duZDsG3tvoA}

第十關:header 的 user agent

http://lidemy-http-challenge.herokuapp.com/lv10?token={duZDsG3tvoA}

時間過得真快啊,今天是你在這邊幫忙的最後一天了。

我們來玩個遊戲吧?你有玩過猜數字嗎?

出題者會出一個四位數不重複的數字,例如說 9487。
你如果猜 9876,我會跟你說 1A2B,1A 代表 9 位置對數字也對,2B 代表 8 跟 7 你猜對了但位置錯了。

開始吧,把你要猜的數字放在 query string 用 num 當作 key 傳給我。

純粹猜數字,在原關卡網址後面接上 num=0000 來猜,猜到答案為 9613,並得到以下訊息:

很開心在這裡的時光能有你一起陪伴,讓我的生活不再那麼一成不變,很開心認識你,下次有機會再一起玩吧!

The End,恭喜破關!

author: huli@lidemy.com
https://www.facebook.com/lidemytw/

附註:
原本遊戲只規劃到這邊,第十關就是最後一關。
後來我有加了一些新關卡但難度較高,如果你還想挑戰看看,下一關的 token 為 {IhateCORS}

以上,使用第二版 api 的關卡(6~10)就結束了,接下來就進入到使用第三版 api 的關卡,在第三版 api 文件底下,就會看到很多前人簽到的身影XD


V3

第十一關:origin

http://lidemy-http-challenge.herokuapp.com/lv11?token={IhateCORS}

嘿!很開心看到你願意回來繼續幫忙,這次我們接到一個新的任務,要跟在菲律賓的一個中文圖書館資訊系統做串連
這邊是他們的 API 文件,你之後一定會用到:https://gist.github.com/aszx87410/0b0d3cabf32c4e44084fadf5180d0cf4

現在就讓我們先跟他們打個招呼吧,只是我記得他們的 API 好像會限制一些東西就是了...

純粹用 api 打招呼,會得到以下的回覆:

您的 origin 不被允許存取此資源,請確認您是從 lidemy.com 送出 request。

方法是在原本的 header 加上一行 origin:'lidemy.com' 就能解開,得到下一關 token 的訊息:

Hello! 下一關的 token 為 {r3d1r3c7}

當時找 request module 的文件,怎麼搜就是沒看到有關 origin 的部分,直到看到第三版 api 有人留言「只有/hello會檢查Origin,其他都不會了阿」以及看了提示 伺服器會檢查 origin 這個 header,只要騙過伺服器就行了,才發現是要在 header 裡面加 origin。

第十二關:轉址

http://lidemy-http-challenge.herokuapp.com/lv12?token={r3d1r3c7}

打完招呼之後我們要開始送一些書過去了,不過其實運送沒有你想像中的簡單,不是單純的 A 到 B 而已
而是像轉機那樣,A 到 C,C 才到 B,中間會經過一些轉運點才會到達目的地...算了,我跟你說那麼多幹嘛

現在請你幫我把運送要用的 token 給拿回來吧,要有這個 token 我們才能繼續往下一步走

這一關直接用原本的 api 網址,獲取運送 token:
https://lidemy-http-challenge.herokuapp.com/api/v3/deliver_token_result
會看到下面的回覆

我已經把運送要用的 token 給你囉,請你仔細找找

在 node.js 裡面看 response,也只會看到兩個途中轉址的網站:

但 response 怎麼看,就是找不到 token 在哪,我在這卡了幾十分鐘,把 response 裡我覺得有可能的字串全部都試過,結果都沒中,看了 hint 的說明,也不太知道 token 的所在。後來靈機一動,想到可以用 chrome 的開發者工具來看轉址中的 requests 和 responses,才找到 deliver_tokenstopover 轉址的 response 才有一個叫做 X-Lv13-Token 的東東,就是下一關的 token qspyz。

第十三關:proxy

http://lidemy-http-challenge.herokuapp.com/lv13?token={qspyz}

太好了!自從你上次把運送用的 token 拿回來以後,我們就密切地與菲律賓在交換書籍
可是最近碰到了一些小問題,不知道為什麼有時候會傳送失敗
我跟他們反映過後,他們叫我們自己去拿 log 來看,你可以幫我去看看嗎?
從系統日誌裡面應該可以找到一些端倪

直接用 api 會得到以下回覆:

此 request 不是來自菲律賓,禁止存取系統資訊。

所以是要用菲律賓的 ip? hint 的說明則是:

你有聽過代理伺服器 proxy 嗎?

那八九不離十是要用菲律賓的 ip 連到 api 才能得到答案,上網蒐一堆 free proxy Philippines,在 request 的 header 加上 proxy: 'http://111.68.40.15:8080'(當時找到的其中一個 proxy),連過去,得到下一關的 token SEOisHard。

[
{ logType: 'token', value: '{SEOisHard}' }
]

當時找了很多 ip 連,但大多都是連太久出現 Error: tunneling socket could not be established, cause=socket hang up at ClientRequest.onError 的錯誤,就一直換,直到連到可以的,才有下一關 token 的回覆,感動。

第十四關:user agent again

http://lidemy-http-challenge.herokuapp.com/lv14?token={SEOisHard}

跟那邊的溝通差不多都搞定了,真是太謝謝你了,關於這方面沒什麼問題了!
不過我老大昨天給了我一個任務,他希望我去研究那邊的首頁內容到底是怎麼做的
為什麼用 Google 一搜尋關鍵字就可以排在第一頁,真是太不合理了

他們的網站明明就什麼都沒有,怎麼會排在那麼前面?
難道說他們偷偷動了一些手腳?讓 Google 搜尋引擎看到的內容跟我們看到的不一樣?

算了,還是不要瞎猜好了,你幫我們研究一下吧!

我原本以為結束了,所以就隨便 call 個 api:

<html>
    <h1>Library</h1>
    <p>Hello, here is the website for lidemy library</p>
</html>


得到的回覆好像也沒什麼,用瀏覽器看也沒什麼不對勁,就直接找 hint。

伺服器是怎麼辨識是不是 Google 搜尋引擎的?仔細想想之前我們怎麼偽裝自己是 IE6 的

所以是 User-Agent 要改,但要怎麼讓伺服器知道是 Google 搜尋引擎?
搜到在 MDN 的 User-Agent 頁面底下,網路爬蟲與機器人的用戶代理字串的示例用的是 Googlebot/2.1,加到 request 的 header,會得到帶有 token ILOVELIdemy!!! 的回覆:

<html>
    <h1>I Love Google</h1>
    <p>Google please rank our website higher, PLEASE!</p>
    <!-- token for lv15:{ILOVELIdemy!!!}  -->
</html>

第十五關:終點

http://lidemy-http-challenge.herokuapp.com/lv15?token={ILOVELIdemy!!!}

還真的是我猜的那樣...不過還是要謝謝你幫我們完成這麼多任務!
今天是我在這職位的最後一天啦,之後我要升官了,應該就不用處理這麼多小事情了
這段期間感謝你的幫忙,我們以後有緣再相見啦!

The End,恭喜破關!
這次是真的破關了,這是最後一關,感謝你願意參與這個遊戲
也希望這遊戲是有趣的,希望你在玩的時候有學到東西
也歡迎把這個遊戲分享給親朋好友們
感謝!

我開了一個 gist,大家可以在這邊隨意留言,或是講一下破關感言
https://gist.github.com/aszx87410/1dbde92876ba253a45654988ca829ebb

最後,感謝所有幫我測試的朋友們

Author: huli@lidemy.com
https://www.facebook.com/lidemytw/

至此全部破關,終於~~~~
在最後破關的留言板上,才看到有人用 Postman 這套工具,初看似乎是個超級方便,也很好操作的東西,下次有機會想試試。


#Lidemy #lidemy-http-challenge #javascript







Related Posts

r3:0 異世界網站挑戰 Lv. 11 ~ 15 攻略

r3:0 異世界網站挑戰 Lv. 11 ~ 15 攻略

計算機程式語言

計算機程式語言

Sequelize 的 createdAt 時間不對

Sequelize 的 createdAt 時間不對


Comments