不想寫網課作業,17 歲少年敲程式碼「開掛」,結果火到了平臺 CEO 面前……

整理 | 鄭麗媛

出品 | 程序人生(ID:coder_life)

Perl 語言的發明人 Larry Wall 曾說,優秀程式設計師應該有三大「美德」:懶惰、急躁和傲慢。其中,懶惰直接作為了程式設計師的「第一美德」——因為懶得做一些重複低效的工作,優秀程式設計師會花時間研究如何把工作變得高效省力。

近來,一位來自英國的 17 歲少年 Alistair Smith 就很好地體現了這一「美德」:因為懶得寫網課作業,Alistair 聯合朋友對線上平臺進行逆向工程,然後搞了個腳本「開掛」。

用腳本跳過 20 分鐘的網課視訊

據 Alistair 介紹,早在 2018 年他所在的學校就開始使用一種名為 HegartyMaths 的全新線上作業平臺。老師會在這個平臺上選擇一個主題作為家庭作業,學生則要觀看關於該主題的一個 10-15 分鐘的網課視訊(觀看的同時還要寫筆記),並完成一個簡短的測驗。

對此,Alistair 抱怨道:「聽起來很簡單,但實際上這很費時間,尤其是測驗,在最壞的情況下可能需要一個小時才能完成一個主題。」

正如開頭所說,懶惰這一「美德」很好地體現在了 Alistair 身上:為了逃避寫作業,想把更多時間用在打遊戲和敲程式碼上,Alistair 找了他的密友 Scott Hiett,打算一起研究怎麼把這個網課作業「翹掉」,而突破口自然是 Hegarty 這個線上學習平臺。

通過對前端應用進行逆向工程,Alistair 和 Scott 想出了用 Tampermonkey 使用者腳本。該腳本可以讓嵌入式 YouTube 播放器出故障,顯示使用者已經觀看了至少 1 次視訊,最重要的是老師也能看見這個數字——也就是說,這個腳本能讓學生跳過 20 分鐘的觀看視訊時間。

之後一段時間,Alistair 學校的許多朋友都找他要 Tampermonkey 腳本跳過網課視訊,後續在多次使用中,Alistair 發現甚至可以把觀看次數設為 9999 次:「不過每次我們這樣做時,我們的帳戶都會被 Hegarty 團隊重置。」

200 行程式碼庫,收集所有測驗答案

到了 2018 年 11 月,Alistair 向他們的數學老師報告了這一漏洞,並讓她向 HegartyMaths 發送郵件同步,結果 Hegarty 團隊給予的回答是:「雖然我們會調查他(Alistair)發現的任何問題,但我們更希望他專注於數學,而不是試圖利用這個機會。」

在收到這封郵件後,Alistair 坦言:「這個回應讓我們有點興奮,因為他們現在知道我們在搗亂網站,但似乎無意修復我們知道這個小漏洞,所以我們可以繼續利用它。」

成功找到 HegartyMaths 的漏洞後,Alistair 很快就將目標轉向了另一個名為 Educake 的線上學習平臺,其主要用於生物、化學和物理教學。

Hegarty 和 Educake 之間有一個共同機制,即一旦答錯了問題,系統會立即給出正確答案。利用這一特點,Alistair 和 Scott 編寫了一個 node/mongo 應用和 Tampermonkey 腳本來檢測使用者何時在測驗頁面上,並用隨機數回答每個問題,然後將正確答案儲存在 mongo 資料庫中。

其中,Alistair 透露 TamperMonkey 腳本大概類似於下列程式碼:

    const guess = Math.random();const result = await post(‘/api/answer’, {body: {answer: guess,},});await post(‘http://localhost:8080/save’, {body: {question_id: question.id,answer: result.success ? guess : result.correct_answer,},});// Go to next question and repeat code abovenextQuestion();

    「正如你所看到的,它實際上是每個問題的循環,保存了我們得到的正確答案並繼續推進。」在收集到正確答案後,Alistair 他們還添加了一些從資料庫獲取的功能以及對多項選擇的支持,最後將其全部捆綁到一個簡單的 Handlemonkey 腳本中,並上傳至 Snapchat(一款支持「閱後即焚」的即時社交軟體)供別人使用。

    Alistair 自豪表示:「最終結果?一個大約 200 行程式碼庫,收集了線上學習網站上的所有問題和答案,每次測驗都能重複獲得 100% 的準確率,還有一個 15mb 的 mongo 資料庫。」

    這初步的成功給了 Alistair 很大動力,因此他又找到了一位名為 Jake 的網友,並和他一起抓取了 Hegarty 的整個資料庫:「我們有了一個可以與 Hegarty 公司本身價值相當的 JSON 檔案,因為整個產品實際上就是我們複製的資料庫。」

    在這些基礎上,Alistair 他們製作了一個 Chrome 擴展程序 Mochip。總體而言,Mochip 集合了他們抓取的 Hegarty 和 Educake 資料庫,託管在 Heroku 免費層和 MongoDB Atlas 免費層上,使用者可以登入,輸入問題並獲取 Mochip 對該問題的答案列表。

    最終大翻車,被 Hegarty CEO 發現

    不想寫作業的學生何其多,因此 Mochip 的使用者群在短時間內便迅速擴大,甚至最終還有了一個 Discord 伺服器——一切看起來都很順利,直至 Hegarty 的 CEO Colin Hegarty 上網搜到了 Scott 發佈的一則關於 Mochip 的 Reddit 帖子。

    在嘗試 Mochip 並發現它確實能用後,Colin Hegarty 大感震驚,但卻並未因此惱怒或起訴,而是發了一封郵件給 Alistair 想約時間聊聊:

    「我對你做這件事的技能和能力印象深刻,我想你和你的朋友們一定非常聰明。我最初成立 HegartyMaths,是試圖幫助孩子們在生活中學習和進步……我希望有機會和你談談你開發的應用。我們能不能在週末前約個時間聊一聊?有時候遇到這樣的情況,有的公司可能會採取法律手段來處理,但我更願意和你聊天,以友好的方式解決這個問題。」

    收到這封郵件後,Alistair 直言「很沮喪,但也有點滿足」——在某種程度上來說,成功吸引 Colin Hegarty 本人的注意也算是一件蠻厲害的事。

    在之後約定的線上聊天中,Alistair 和 Scott 先後與 Colin Hegarty 和 Educake 團隊分別都進行了對話,並主動給出了防止再次出現這種情況的完整解決方法:首先,使用 Redis 實現一個簡單的速率限制,這將使自動化測試變得非常困難;其次,打亂資料庫中的 ID,儘可能使克隆的資料庫無效。

    待一切塵埃落定後,Alistair 反省道:「我特別想感謝傳奇人物 Colin Hegarty 在與我聯繫時的善意和體貼。如果不是這樣,事情的結果對我來說可能會更嚴重。HegartyMaths 是一個出色的學習資源,歸根結底,它是為了幫助學生學習而不是帶來不便。」

    Alistair 將這起事件整體覆盤後,其文章在 HN 上引起了熱議。部分網友稱讚 Colin Hegarty 友善的處理方式,有網友認為「這種經歷可能比 Alistair 躲過的網課作業更有價值」,也有網友說:「大部分學生可能真的需要這些作業來鞏固學習,而這種應用會削弱他們在這方面的能力。」

    對於這件事,你的看法又是什麼呢?

    參考連結:

    • https://alistair.blog/mochip

    • https://news.ycombinator.com/item?id=32945906

    相關文章

    Ruby 語言問世 | 歷史上的今天

    Ruby 語言問世 | 歷史上的今天

    整理 | 王啟隆 透過「歷史上的今天」,從過去看未來,從現在亦可以改變未來。 今天是 2022 年 12 月 21 日,在 55 年前的今天...