十一行 JavaScript 程式碼搞垮了網路。一個取消發佈。
2016 年 3 月 22 日,世界標準時間 21:30:一名開發者在 npm 將套件名稱「kik」交給訊息應用程式 Kik 後,取消發佈了他所有 273 個 npm 套件,而 Kik 的專利代理人曾揚言「律師會上門」。
2016 年 3 月 22 日,世界標準時間 21:30:一名開發者在 npm 將套件名稱「kik」交給訊息應用程式 Kik 後,取消發佈了他所有 273 個 npm 套件,而 Kik 的專利代理人曾揚言「律師會上門」。這 273 個套件中包含 left-pad:十一行程式碼,用於在字串前面加上空白,每月下載量達 250 萬次。數分鐘內,Babel、React 和 Node 的建置在全球範圍內失敗,每分鐘數百次。一個分支在十分鐘內出現,但沒有改變任何東西,因為 Babel 透過行號引入 left-pad,精確鎖定 0.0.3 版本。23:55 時,npm 從備份中恢復了已刪除的版本——這是該註冊中心歷史上的首次「取消取消發佈」——一週後實施了 24 小時取消發佈規則。根據 npm 自己的說法和 Kik 發佈的電子郵件串,事後分析如下:該註冊中心允許任何作者刪除任何版本,而不檢查其依賴項;過渡樹在每次安裝時即時解析;預設情況下沒有鎖定檔。歸責:60% npm / 25% Kik / 15% 依賴習慣。修復裁決:SHIP IT。
本影片重點
- 3 月 11 日:Kik 的專利代理人要求 Azer Koçulu 重新命名 `kik`;一小時後:律師「將會上門,並查封你的帳戶」;Azer:30,000 美元;Kik 電子郵件給 npm 支援
- 3 月 18-20 日:npm 的執行長將名稱轉讓給 Kik(「合理預期它與 kik.com 相關」);Azer 要求刪除他所有的模組
- 3 月 22 日,世界標準時間 21:30-23:55:273 個套件取消發佈;left-pad@0.0.3 在 Babel、Atom、Node 專案中出現 404 錯誤;21:42 出現 fork 1.0.0;npm 的 CTO 在 23:03 推文「un-un-publishing」;0.0.3 在 23:55 從備份中恢復——歷時 2.5 小時
- 3 月 23 日和 3 月 29 日:npm 的事後檢討(「我們失誤了」)和新政策:只能在 24 小時內取消發佈,已移除名稱的安全佔位符(自 2020 年起為 72 小時)
翻譯文字稿
譯自英文原版旁白。可用的音訊和字幕由 YouTube 控制。
0:00 一位開發者刪除了十一行 JavaScript 程式碼,幾分鐘內,Babel、 React 和 Node 的建置在全球範圍內失敗,每分鐘數百次。 這個函式是 left-pad。 它會用空格填充字串,到了晚上結束時,npm 做了 它聲稱無法做到的事情:重新發佈已刪除的版本。 它是如何發生的,為什麼會發生,以及誰該負責。 這裡是 The Daily Diff,事後檢討。 三月十一日。訊息應用程式 Kik 的一位專利代理人,
0:26 發電子郵件給 Azer Koçulu:請重新命名你的 npm 套件,kik 是我們的品牌。 Azer 說不。 一小時後:我們的商標律師將會上門,並 查封你的帳戶。 Azer 開價三萬美元, Kik 將該串電子郵件轉寄給 npm 支援。三月十八日。 npm 的執行長裁定,任何輸入 npm install kik 的人預期的是訊息
0:48 應用程式,並將名稱轉交。 Azer 要求刪除他所有的東西。 兩天後,他自己動手:兩百七十三個套件。 三月二十二日,世界標準時間 21:30。 每個需要 left-pad 的建置都得到 404 錯誤。 十分鐘後,一位陌生人將其重新發佈為 1.0.0 版本, 但沒有任何改變,因為 Babel 和 Atom 是透過一個名為 line-numbers 的套件載入它,而該套件精確指定了 0.0.3 版本。
1:13 23:03 時,npm 的 CTO 推文:取消取消發佈。 23:55 時,0.0.3 版本從備份中恢復。 兩個半小時。 為什麼一個人可以做到這一點? 三個原因。npm 上的任何版本都可以由其作者立即刪除, 無需檢查誰依賴它。 其次,依賴關係是遞移的:Babel 不知道 left-pad 的存在, 它知道 line-numbers,而整個樹在每次安裝時都是即時解析的。
1:36 第三,在 2016 年,預設情況下沒有東西鎖定該樹;鎖定檔是選擇性加入的, 所以每個 CI 執行都會重新詢問網路這十一行程式碼是什麼樣子。 一個註冊中心,由沒有依賴它的人管理。 git blame。npm,百分之六十:它自己的事後檢討說,不受限制的取消發佈 造成了痛苦,引述原話,我們失誤了。 Kik,百分之二十五:一位專利代理人,而不是律師, 揚言要找律師上門,只為了 Kik 已經決定不使用的名稱。 依賴習慣,百分之十五:每個不是自己手打而是 npm-installed 了十一行程式碼的人。
2:06 而不是自己手打。 包括 Kik,他們的建置也失敗了。 爆炸半徑:兩百七十三個套件被移除, 其中一個每月下載兩百五十萬次。 修復需要兩個半小時;該函式只有十一行。 在 Hacker News 上,一篇詢問我們是否忘記了如何程式設計的貼文獲得了 一千七百個讚,大多來自建置仍然失敗的人。 裁決,事後檢討:SHIP IT。
2:26 npm 從備份中恢復,隔天發佈事後檢討, 並在一週內實施了至今仍在實行的規則:你可以在 二十四小時內取消發佈,之後你需要與真人溝通。 週一:提交你的鎖定檔,如果一個函式只有十一行, 它就是一個段落,而不是一個依賴項。 請將你仍然不被允許談論的事件寄給我, 在評論中,或寄到 the daily diff dot dev。 這就是今天的 The Daily Diff。
2:48 我是 Axrisi 的 Niko。 負責地合併。
來源
- npm, Inc., "kik, left-pad, and npm" (Mar 23, 2016)blog.npmjs.org
- npm, Inc., "changes to npm's unpublish policy" (Mar 29, 2016)blog.npmjs.org
- Azer Koçulu, "I've Just Liberated My Modules" (Mar 22, 2016; archive copy)web.archive.org
- Mike Roberts (Kik), "A discussion about the breaking of the Internet" — the full e-mail thread (Mar 23, 2016; archive copy)web.archive.org
- Laurie Voss (npm CTO) on X, Mar 22, 2016, 23:03 UTCx.com
- left-pad 0.0.3 on the npm registry (the eleven lines)registry.npmjs.org
- Hacker News, Mar 22, 2016 — "I've Just Liberated My Modules" (1,573 points)news.ycombinator.com
- Hacker News, Mar 23, 2016 — "NPM and Left-Pad: Have We Forgotten How to Program?" (1,725 points)news.ycombinator.com
- Hacker News, Mar 29, 2016 — "Changes to Npm's unpublish policy" (320 points)news.ycombinator.com
- The Register, Mar 23, 2016 — "How one developer just broke Node, Babel and thousands of projects in 11 lines of JavaScript"www.theregister.com



