Skip to content

Releases: fhsh-tp/web-exploit-laboratory

Release v2.5.0

Choose a tag to compare

@github-actions github-actions released this 16 Sep 12:47
b6b6ed3

What's Changed

  • 📝 docs: 回寫研習發布驗收證據並歸檔 workshop-release-validation by @CXPhoenix in #85
  • 🐛 fix: 判定完成前不再叫學生去按還沒出現的選項 by @CXPhoenix in #86
  • ✨ feat: 沒有語系偏好的訪客改為看到繁體中文,並歸檔 gate-checking-state by @CXPhoenix in #87
  • 🔧 chore: archify skill 納入版控,並歸檔 default-visitor-locale by @CXPhoenix in #88
  • ✨ feat: 攻擊紀錄可以匯入與清除,而沿用確認只在題目頁發問 by @CXPhoenix in #89
  • 🐛 fix: 匯入測試不再用兩個字元去比對含隨機 UUID 的序列化字串 by @CXPhoenix in #91
  • 🚀 release: 準備 v2.5.0 攻擊紀錄匯入與發問範圍發布 by @CXPhoenix in #90
  • 🚀 release: v2.5.0 攻擊紀錄匯入與發問範圍 by @CXPhoenix in #92

Full Changelog: v2.4.1...v2.5.0

Release v2.4.1

Choose a tag to compare

@github-actions github-actions released this 14 Sep 10:53
875e581

✨ [2.4.1] - 2026-09-14

新增第 10 題白箱 Web 題目;要取得旗標,必須把跨文章修訂與選文相容流程兩個缺陷串接起來。

✨ 新增

  • 新增 Medium 難度的「Selected Excerpts」白箱題目。教材選文編輯台的跨文章章節修訂 IDOR,會把投稿內容寫進已入選章節;講義的 legacy include 相容流程才會解析其中的 template payload。(#82)
  • Source 面板公開資料、共用修訂與講義組裝的模組邊界,供解題者從技術債線索理解兩個缺陷的組合關係。(#82)

🔄 變更

  • 儲存章節後的原地回跳顯示 snackbar,讓提交成功而內容未改變的畫面仍有明確回饋。(#82)

Release v2.4.0

Choose a tag to compare

@github-actions github-actions released this 13 Sep 10:10
d07e35d

✨ [2.4.0] - 2026-09-13

本版補齊教師研習與日常練習所需的本機紀錄、進度及匯出流程,並修正回訪交旗與草稿保存問題。

✨ 新增

  • 新增第 8 題「Just a Preview」與第 9 題「Plain Text Only」,練習白箱 Jinja2 SSTI。(#67、#68)
  • 題目列表與導覽列顯示完成標記及解題進度;攻擊紀錄支援同一題多次練習。(#70、#72)
  • 攻擊紀錄可匯出 JSON/Markdown、完整/精簡內容,支援選填姓名與班級及 SHA-256 完整性檢查。精簡版省略 HTTP 回應本文與面板檢視事件,保留程式碼、請求本文、筆記、旗標嘗試與草稿。(#78)

🐛 修復

  • 共用電腦接手與清除流程補上儲存及復原處理,並提供公用電腦、個人設備的操作指引。(#74、#79)
  • 交旗答案判定與紀錄是否保存分開顯示;回訪與重新整理後的交旗欄位可正常操作。(#77、#80)
  • Code 最後修改與空草稿可在立即重新整理後還原;同步備份寫入失敗時提醒先複製內容。(#80)
  • 修正行動裝置題目頁底部的可操作範圍。(#75)

使用提醒

紀錄仍保存在目前瀏覽器,沒有帳號同步;下載檔案尚無匯入功能。公用電腦離開前請先下載需要的紀錄,再清除此機資料。SHA-256 檢查用於偵測內容變動,不是身分簽章或防作弊認證。

Release v2.3.0

Choose a tag to compare

@CXPhoenix CXPhoenix released this 06 Sep 07:10
80f5910

這一版讓題目「發得出去」:每題有一個改名也帶不走的編號,短連結變成畫面上看得到、按一下就複製得到的東西——在這之前,發連結只能靠老師憑記憶打字。

✨ 新增 (Added)

  • 每題有一個永久編號,短連結改用它。/c/001 與 /zh/c/001 直接開該題,而且題目改名之後仍然指向同一題——這正是編號存在的理由:slug 是題目「叫什麼」,改名之後參數化規則會跟著改名走,於是印在講義上、已經發出去的那條連結就靜默失效了。既有七題依上架日期拿到 1 到 7。編號一經指派就凍結,已下架題目的號碼永久保留、不重新發出。只提供補零的正式寫法,/c/1 不是本站提供的形式 (#62)
  • 題目列表每一列與題目頁標題旁,都能看到並複製該題的短連結。畫面上顯示的是去掉協定的位址、按下複製鈕拿到的是完整絕對網址;繁體中文語系顯示與複製的都是 /zh/c/ 形式。網址本身是可以反白選取的文字,複製鈕只是捷徑 (#62)
  • 剪貼簿寫不進去的時候,訊息會指向畫面上那段網址。非安全來源、權限被拒、舊瀏覽器都會讓複製失敗,而只回報「失敗」會讓人無路可走。網址之所以用文字呈現,就是為了讓這個分支有去處 (#62)

🔄 變更 (Changed)

  • docs/public/_redirects 不再手寫,改由腳本從題目樹產生,並掛進建置流程。手動改動會被守門測試擋下:它比對 committed 的檔案與從題目樹重新產生的內容是否逐字相同。每題兩條數字規則排在既有兩條參數化規則之前——Cloudflare 第一個命中者勝,而 /c/:slug 也吃得下數字,順序寫反會靜默失效 (#62)
  • pnpm create:challenge 產出的 frontmatter 自動帶編號,值取所有已指派編號的最大值加一,計算範圍含已下架的題目 (#62)
  • 題目驗證多了四項檢查:缺號、不是大於零的整數、兩個語系樹數值不一致、與其他題目重號,四種情形各自被擋下並指名是哪一題 (#62)
  • 既有的 /c/<slug> 與 /zh/c/<slug> 行為完全不變,已經發出去的 slug 連結繼續有效 (#62)

🗑️ 內部 (Internal)

  • 規格變更 challenge-numbering-and-sharing 已歸檔,四份 delta 套進 live spec。使用者不可見 (#62)

What's Changed

  • ✨ feat: 題目改用永久編號,短連結由題目樹產生並可一鍵複製 by @CXPhoenix in #62
  • 🔧 chore: 版號推進 2.3.0 by @CXPhoenix in #63
  • 🚀 release: 2.3.0 上 production by @CXPhoenix in #64

Full Changelog: v2.2.0...v2.3.0

Release v2.2.0

Choose a tag to compare

@CXPhoenix CXPhoenix released this 06 Sep 05:09
af640b2

這一版讓題目可以「開源」:學習者不再只能從外部戳,而是能直接讀應用程式的原始碼找問題。白箱功能與第一題一起上架,另外修掉四個會被看見的缺陷——包括 Code 面板一直沒有忠實顯示 Python 的輸出。

✨ 新增 (Added)

  • 白箱題型:題目可以把原始碼攤開給學習者讀。題目在 frontmatter 宣告之後,應用程式原始碼會以唯讀檢視器呈現在新的 Source 分頁,支援語法高亮、字級調整與搜尋。展示副本在 build 期經過遮罩處理;另可列出額外要展示的檔案路徑,例如掛進映像檔的設定檔,讓一題同時攤開好幾個檔 (#50)
  • 白箱首題「Already Authenticated」(難度 easy)。Northwind 內部事故主控台的白箱滲透測試委託,忠實重現一個較新的真實 CVE 的根因:一個為了防止中介層無限遞迴而設的計數器,被當成了信任訊號。門檻與設定住在掛進映像檔的閘道設定檔裡、應用程式只讀它,所以要讀兩個檔才拼得出完整圖像——這正是多檔展示的用處 (#56)

🐛 修復 (Fixed)

  • 部分題目一出生就打不開。題目金鑰產生器的處理順序讓混淆步驟有機率把剛注入的題目資料整段丟掉,中獎與否在該題產生的當下就決定、之後每次載入都一樣壞。改為先混淆再注入,並在上架前讀回驗證 (#52)
  • Code 面板不再把多行輸出黏成一行。面板接收 Python 輸出的方式是以行為單位的,而那個介面會把每一行的換行去掉;更嚴重的是沒有換行結尾的內容根本不會送達,print(..., end='') 印出來的東西完全看不到。改為以位元組接收、跨區塊保留解碼狀態,並在每次執行結束後主動要求輸出 (#58)
  • 題目頁面的字型退回襯線體。頁面骨架把樣式表當成一般資料傳進會自動轉義的樣板,字型名稱的引號被換成字元參照,而 <style> 不會把它解回來,整條宣告因此失效。五個題目受影響 (#57)
  • 白箱題的原始碼不再附帶一份答案。該題檔案開頭的說明直接點名了漏洞類型與目標,中介層還有一段註解把非預期解整段寫出來。那些是出題者寫給自己看的、在不展示原始碼的題目無妨,白箱題卻會整份出貨。改寫成真正的服務說明,並刻意保留守門機制存在的營運理由——那是推理的素材,不是答案 (#59)
  • 以 production 模式安裝時會缺少檢視器需要的套件。原始碼檢視器在執行期動態載入的一個套件被歸在開發相依,完整安裝的 CI 看不出來。連同一支守門測試一起修,往後任何執行期動態載入的套件都必須列在正式相依裡 (#54)

🗑️ 內部 (Internal)

  • 三個規格變更歸檔並把 delta 套進規格本文,同時補上實作與驗證的歸屬紀錄;使用者不可見 (#51)、(#53)、(#55)

What's Changed

  • ✨ feat: 接上白箱(source_visible)功能——展示副本經 build 期遮罩後以 CodeMirror 唯讀檢視器呈現 by @CXPhoenix in #50
  • 📝 docs: archive whitebox-source-viewer——delta 套進 live spec 並補齊 @trace 歸屬 by @CXPhoenix in #51
  • 🐛 fix: keygen 先 mutate template 再注入 chall-data,並在上架前讀回驗證 payload——修掉部分 slug 一出生就沒有 payload 的缺陷 by @CXPhoenix in #52
  • 📝 docs: archive keygen-mutate-before-inject——obfuscation 管線的 requirement 套進 live spec 並補上 @trace by @CXPhoenix in #53
  • 🐛 fix: 把 @codemirror/search 搬到 dependencies,補上執行期 import 的守門測試 by @CXPhoenix in #54
  • 🔧 chore: archive codemirror-search-runtime-dep by @CXPhoenix in #55
  • ✨ feat: 新增白箱題 already-authenticated——中介層遞迴防護的授權繞過 by @CXPhoenix in #56
  • 🐛 fix: 修好五個題目被 autoescape 轉義的樣式表 by @CXPhoenix in #57
  • 🐛 fix: Code 面板顯示 Python 實際寫出的輸出,測試讀到完整輸出 by @CXPhoenix in #58
  • 🐛 fix: 白箱題的原始碼不再附帶一份答案 by @CXPhoenix in #59
  • 🚀 release: 2.2.0——白箱題型上線與四個看得見的修正 by @CXPhoenix in #60
  • 🚀 release: 2.2.0 上 production——白箱題型與白箱首題,Code 面板輸出保真 by @CXPhoenix in #61

Full Changelog: v2.1.2...v2.2.0

Release v2.1.2

Choose a tag to compare

@github-actions github-actions released this 05 Sep 05:36
d60fb8c

What's Changed

  • 📝 docs: 讓 ruleset 的規格描述與實際設定一致,並修掉一個為假的前提 by @CXPhoenix in #45
  • 🔒 fix: 攻擊紀錄匯出檔的圍堵句涵蓋整個 session 子樹,文件明示 AI writeup 不作評量依據 by @CXPhoenix in #47
  • 🔧 chore: 安裝八個第三方技巧並更新 skills-lock by @CXPhoenix in #46
  • 🚀 release: 2.1.2 by @CXPhoenix in #48
  • 🚀 release: 2.1.2 進 main by @CXPhoenix in #49

Full Changelog: v2.1.1...v2.1.2

Release v2.1.1

Choose a tag to compare

@github-actions github-actions released this 30 Aug 16:50
6740016

What's Changed

  • ✨ feat: 首頁加入品牌 hero 圖與 favicon,深色主題給 logo 螢光 by @CXPhoenix in #42
  • 🚀 release: 2.1.1——首頁品牌 hero 圖與 favicon by @CXPhoenix in #43
  • 🚀 release: 2.1.1 上 production——首頁品牌 hero 圖與 favicon by @CXPhoenix in #44

Full Changelog: v2.1.0...v2.1.1

Release v2.1.0

Choose a tag to compare

@github-actions github-actions released this 30 Aug 16:13
c495f8e

What's Changed

  • 🔧 chore: 將 humane-prose-audit 與 phoenix-writing vendor 進專案 by @CXPhoenix in #36
  • 📝 docs: 使用者文件分層為操作手冊與知識庫 by @CXPhoenix in #37
  • 🔧 chore: 歸檔 user-docs-layering 並補回被改寫取代的歸屬 by @CXPhoenix in #38
  • 🐛 fix: 修好 Browser 面板的 cookie 載體解析,並把題目驗證組接進 CI by @CXPhoenix in #39
  • 🚀 release: 2.1.0——修好登入狀態留不住的缺陷,文件分層為操作手冊與知識庫 by @CXPhoenix in #40
  • 🚀 release: 2.1.0 上 production——修好登入狀態留不住的缺陷,文件分層為操作手冊與知識庫 by @CXPhoenix in #41

Full Changelog: v2.0.0...v2.1.0

Release v2.0.0

Choose a tag to compare

@CXPhoenix CXPhoenix released this 29 Aug 13:35
4694727

Code 面板從一個「能一行讀走 flag、登入狀態留不住、一個無窮迴圈就鎖死整個分頁」的半成品,變成真正可用且與題目隔離的解題環境;題目頁不再因為靜置或多開分頁而毫無訊息地失效;並新增三題商業邏輯黑箱練習題。

🔒 安全性 (Security)

  • Code 面板不再能一行讀走 flag:面板改跑在與題目完全隔離的獨立 Python 環境,在面板內讀取 flag 檔或列出題目原始碼一律得到找不到檔案。先前面板與題目共用同一份虛擬檔案系統,所有宣告可用 Code 工具的題目都能用一行讀檔繞過 (#29)
  • 關閉一個只存在於本實驗室的非預期解:cookie 值原本以分隔字元串接傳遞,題目若把使用者輸入接進 Set-Cookie,送一個控制字元就能把一個 cookie 切成兩個。改為逐值編碼 (#32)

✨ 新增 (Added)

  • 三題全新的商業邏輯黑箱練習題:〈不問原因〉授權經銷商客戶入口(超額購買旗艦授權)、〈每人限用一次〉售票平台(把高價訂位壓到免付款)、〈須經核准〉門禁申請系統(以無權限帳號取得管制區門禁碼)。三題採不同的經濟模型與情境,解題動作刻意不重疊,補上既有三題(資訊洩漏、IDOR、SQLi)未涵蓋的類別。委託書中英雙語齊備,題目卡片標籤只標情境不標漏洞類別,避免點進去前就看到答案 (#28)
  • Code 面板新增 Stop 按鈕:執行中隨時中止,且停止前已印出的內容完整保留——列舉或爆破跑到一半印出的那幾行往往就是答案 (#33)
  • 題目端單次請求加上十秒執行期限:逾時終止該題執行環境並回應 HTTP 508,題目頁同時告知狀態已重置。用專屬的 508 而非 500/503/504,是為了不讓學生把它誤判成別的故障 (#33)
  • Code 面板刻意不設自動執行期限:列舉、爆破、fuzz 都是預期中的解題路徑,任何自動上限都會誤殺正在正確解題的人 (#33)
  • 編輯器內容自動保存:重整或下次回到同一題都接得上;草稿依題目分開,清空後重整維持空白而不是被塞回樣板 (#30)
  • 執行紀錄下拉:列出本題歷次執行的時間、首行摘要與有無出錯,選一筆把原始碼載回編輯器(不直接執行,Cmd+Z 可退回)。天生依題目分隔,不必命名也不必刪除 (#30)
  • 編輯器設定:工具列齒輪按鈕可調整自動完成、括號自動閉合與字型大小(10–24px,可重設)。設定存在本機、跨重整保留、所有題目共用;調整時不重建編輯器,游標與 undo 歷史都留著 (#31)
  • PHP 題目終於能出真的題:可設定回應標頭、HTTP 狀態碼與 Set-Cookie,並使用 PHP 原生 session 跨請求保存資料;出題者另有把題目檔案系統還原成初始狀態的出口 (#32)
  • 執行環境自身出錯時,Network 面板顯示診斷橫幅:沿用站台警告配色,淺色與深色皆達 WCAG AA,讓出題者分得出是題目邏輯錯還是執行環境掛了 (#32)
  • 瀏覽器資料庫開不起來時顯示不可關閉的警示橫幅:說明筆記、執行紀錄與攻擊紀錄皆未儲存也匯不出,並給出處置方式(關掉本站其他分頁再重整)。橫幅不擋操作 (#30)

🔄 變更 (Changed)

  • Code 面板的 Python 環境改為第一次點開 Code 分頁時才載入:載入期間顯示進度並暫時停用執行按鈕。沒用到的學生不再多付載入時間與記憶體,用到的首次約多等三秒 (#29, #33)
  • Code 面板輸出改為邊跑邊出現:長時間的列舉腳本看得到進度 (#33)
  • 環境載入失敗時直接顯示錯誤並保持執行按鈕停用:不再退回改用題目本身的執行環境——讓失敗看得見,也避免退路重新打開讀 flag 的缺口 (#29)
  • 網址形式統一由建置設定決定:一般文件頁無副檔名,題目頁這類目錄型頁面保留尾斜線,兩者都是伺服器認定的正規網址。教室短網址 /c/:slug 目標不變,出題者不需要改既有連結 (#25)
  • 自動完成候選改用本平台自維護的模組清單:新增 requests、保留 os,並加上在真實 Python 環境逐一驗證候選符號的檢查 (#31)
  • 這次作業完全沒有被記錄下來時,匯出按鈕直接不出現:而不是出現卻按了沒反應 (#30)
  • 匯出的攻擊紀錄一併帶上當下尚未執行的草稿並標明未執行過;沒有草稿時該欄位明確為 null,讓讀取者分得出「沒有草稿」與「舊版格式」 (#30)
  • 題目驗證與分析指令的報告少了終端機指令那一項,其餘項目與格式不變 (#26)

🐛 修復 (Fixed)

  • 題目頁不再無訊息卡住:三個來源一次補齊——靜置約一分鐘後所有請求固定回「challenge not registered」,現在會在下一個請求自動重新接上中繼機制;同一題開多分頁、關掉其中一個後存活分頁無限期轉圈,現在等待有固定期限、逾時明確回報並淘汰失效連線;別的分頁開著本站時,Code 面板有版面卻永不出現編輯器、筆記重整後消失、匯出按了沒檔案而主控台一行錯誤都沒有,現在開資料庫有時間上限並主動讓路給其他分頁完成升級 (#30, #32)
  • 在 Code 面板送出無窮迴圈不再讓整個分頁失去回應:執行已搬離主執行緒,頁面維持可互動。先前同執行緒的逾時機制一個都救不了——同步的 WebAssembly 迴圈佔住 event loop,setTimeout、Promise.race、AbortController 全都不會執行 (#33)
  • 用 Python 登入題目後 session 會被記住:後續請求帶著登入狀態,不再被踢回登入頁。先前 cookie jar 永遠是空的,大多數需要登入的題目無法用 Code 面板求解 (#29)
  • 一次回應多個 Set-Cookie 全線修好:Code 面板端不再把多個 cookie 串成一個字串(cookie 到期時間本身含逗號,串接後無法還原);Service Worker 端不再併成一個,整個回應也不再被瀏覽器拒絕 (#29, #32)
  • 同時送出的多個請求不再互相混流:先前兩個並行請求會各自收到兩份回應主體的串接,未授權路由的回應夾帶授權路由的內容——學生可以完全不靠題目要教的漏洞就解出答案。請求現在排隊,一次服務一個 (#32)
  • PHP 題目不再從第二個請求開始就掛掉:先前整題共用同一直譯器,題目只要宣告任何函式,下一個請求就是致命錯誤,全域變數、常數與已送出的標頭也會殘留。現在每個請求都從乾淨狀態開始,只有題目虛擬檔案系統刻意跨請求保留 (#32)
  • PHP 題目收到含 null byte 的參數不再整個請求崩潰:先前參數以字串拼接組進程式碼,一個 null byte 就讓前置程式碼語法錯誤——而那正是 PHP 最經典的 payload 之一 (#32)
  • PHP 題目印出伺服器變數時不再露出執行環境的真實資訊:家目錄、路徑、使用者名稱等主機環境變數不再外流,以資訊洩漏為主題的題目不會直接穿幫 (#32)
  • 題目回應不再被靜默改寫:先前執行環境讀不回題目設定的標頭與狀態碼時,會把「回 403 並設 cookie」降級成「200 且沒有 cookie」,學生因此去 debug 一個題目從未產生過的回應。範圍外與不該帶主體的狀態碼也不再弄死請求,改為明確回報 (#32)
  • 執行環境被重置後立刻重建:重建期間三個發送請求的面板暫時停用,這段時間送達的請求排隊等待而不是直接收到錯誤 (#33)
  • 執行環境起不來時直接告訴你原因:不再留下永遠轉圈的載入畫面。先前只有成功路徑會回報,之後每個請求都卡在同一個就緒狀態,最後回報的還是與真正原因無關的訊息 (#33)
  • 按下 Stop 之後 Run 維持不可用並顯示載入中,直到替代環境真的就緒。先前 Stop 完 Run 立刻可按,但背後的 Python 發行版還要再下載約四十秒 (#33)
  • 離開題目頁時一併關掉該頁的執行緒:搬進 Worker 之後,被丟棄的執行環境是一條活著、扛著整份 WebAssembly runtime 的執行緒,不關分頁就會一直累積 (#33)
  • 輸入單引號或雙引號時不再自動補上另一個:輸入幾個字元就是幾個字元,即使括號自動閉合開著也一樣。先前 Python 語法套件把引號也當成要成對補齊的對象,手打長 payload 會被無聲改壞 (#31)
  • 自動補上的成對括號按一次 Backspace 就整對刪掉,不必刪兩次 (#31)
  • 用鍵盤關閉設定面板後焦點回到齒輪按鈕:不會被丟回頁面最開頭重新 Tab。並修正設定文案的大括號被誤判為變數插值、每次繪製都在主控台留錯誤的問題 (#31)
  • Code 面板載入期間,左欄題目說明可選取、flag 也送得出去:先前載入覆蓋層在畫面上只蓋住面板,實際可點擊範圍卻橫跨整個視窗並吃掉所有點擊 (#29)
  • 站台內點導覽連結後,網址列停在乾淨的無副檔名網址(/challenges 而非 /challenges.html),複製出去的連結不會再多繞一次伺服器導向 (#25)
  • 手寫、未經驗證的題目設定不再能叫出終端機分頁:先前版面直接讀原始設定組分頁列、不查白名單;現在只從四個正式分頁中挑選,寫了也不會出現、也不會報錯 (#26)

🗑️ 移除 (Removed)

  • 終端機面板全套下架:面板、指令系統、使用者虛擬檔案系統與指令解析元件全部移除,平台只剩 Browser/Network/Repeater/Code 四個面板。它的對外表面更早之前已停用,只有實作留著,讓後續每一項改動都得繞過一個學生用不到的工具 (#26)
  • 題目設定中開放終端機指令的欄位已從出題契約移除:舊題目留著它,驗證仍會判定成立、也照常建置,且不會有任何作用,但建議直接刪掉 (#26)
  • Code 面板的「Save」按鈕與「Load script…」下拉移除:先前存下的具名腳本升級後無法取回。舊做法不記錄題目歸屬——A 題存的會出現在 B 題的下拉、存了沒有介面可刪、同名重存變兩筆——因此任何自動搬移都只能用猜的,選擇不搬移。改用執行紀錄還原與草稿自動保存 (#30)
  • 不再自動把非同步的 requests 替身塞進 Code 面板環境:一律使用真正的 requests,寫法與一般 Python 腳本一致。先前是否用到替身取決於學生有沒有打上 import 那一行,而兩者用法不相容 (#29)

💥 Breaking Changes

給學生

  • 具名腳本無法取回:先前用 Save 存下的腳本在升級後取不回來 → 想留就在升級前自行複製出來,之後改用執行紀錄還原或草稿自動保存 (#30)
  • 非同步的 requests 寫法失效:對 requests 做 await 的舊寫法會失敗 → 改成一般同步寫法即可,不需要額外加 import (#29)
  • 直接讀 flag 檔的取巧解法不再有效:靠它拿分的紀錄會失效 → 那本來就是要修掉的缺口 (#29)
  • 程式碼草稿、攻擊 session 與滲透筆記都保留,含終端機事件的舊存檔仍能載入與匯出。瀏覽器內殘留的終端機指令紀錄會被清除,但本站歷史上沒有任何題目啟用過終端機分頁,該紀錄必為空——你不會失去任何東西 (#26, #30)

給出題者

  • 單次請求超過十秒的題目會被終止:回應 HTTP 508,題目狀態(含登入 session 與請求寫進去的檔案)一併重置,沒有豁免途徑 → 必須把單次請求壓進十秒內 (#33)
  • 題目自行送出 X-Wxlsh- 前綴的回應標頭現在會被丟棄並回報 → 該命名空間保留給平台,請改用其他標頭名稱 (#32)
  • 不使用 session 的 PHP 題目恢復真實網站語意(headers_sent()、ob_get_level())→ 依賴舊行為的題目行為會改變,請重新驗證 (#32)
  • 既有六題不受影響:全是 Python 後端、不經過 PHP 執行環境,且本批完全沒有動到 docs/challenge/ 任何檔案,題目的 frontmatter 與內容一行未改

給 fork 維護者(本版真正的破壞對象)

  • 終端機相關程式碼整套移除 → 仍在使用終端機面板、終端機指令欄位或指令解析元件,或沿用 PyodidePublicAPI 型別匯入的 fork,合併後建置失敗,必須整套移除或改由 Code 面板取代 (#26)
  • 腳本儲存 API 移除:useChallengePersistence() 的 saveScript/listScripts/loadScript/deleteScript 與 ScriptEntry 型別消失;exportSession() 新增一個沒有預設值的必填第二參數 → 呼叫端要跟著改 (#30)
  • PHP 執行環境介面改變:run() 的回傳移除 headers 欄位、新增五個必填方法、建構子多一個選用的診斷回呼參數 → 自行建構或替換 PHP 執行環境者要跟著改 (#32)
  • Set-Cookie 的傳輸編碼契約改變:由分隔字元串接改為逐值編碼 → 自行解析該標頭的下游要改用新編碼 (#32)
  • Code 面板的 props 改名:pyodide/pyodideLoading/pyodideError 改為 runner/runnerLoading/runnerError,型別改為 ToolsRuntimeHost;loadToolsPyodide 具名匯出已移除且沒有別名 → 自訂過題目頁版面或 Code 面板的 fork 要跟著改接線,否則 Code 面板拿不到可用的執行環境 (#33)
  • 執行紀錄回呼的 output 語意改變:由「執行結束後的最終全文」變成「累積到中止為止」;被 Stop 中止的執行也會回報且不標記為錯誤 → 既有存檔的欄位型別與還原路徑未變,只有讀取語意要調整 (#33)
  • 不需要動的:題目 frontmatter 的欄位集合與語意、攻擊 session/滲透筆記/程式碼草稿的儲存結構、本機儲存鍵,以及教室短網址規則

What's Changed

  • 🔧 chore: 加入 handoff 技巧,與既有技巧採同一套目錄結構 by @CXPhoenix in #8
  • ✨ feat: 把題目敘述改寫為滲透測試委託書,...
Read more

Release v1.4.0

Choose a tag to compare

@CXPhoenix CXPhoenix released this 19 Aug 10:22
7786e55

語系從此由網址決定:繁體中文題目頁的導覽列不再把讀者丟回英文版,語言切換器改為與站台其他頁面一致的圖示樣式,並移除全站的 GitHub 連結與 Terminal 的對外表面。

✨ 新增 (Added)

  • 存過的語系偏好改以冷載入自動導向表達:偏好過去是就地覆寫執行期語系,位址列與畫面因此可能各說各話。現在偏好會把你帶到該語系的對應網址,兩者永遠一致。導向只從不帶語系前綴的網址出發、且取代歷史紀錄,所以按上一頁不會被再導一次;直接開啟帶 /zh-TW/ 前綴的網址是明確請求,不會被導走 (#15)
  • 語言切換器可用鍵盤操作:先前選項只綁了滑鼠點擊,鍵盤使用者展開得了卻到不了選項。現在支援方向鍵展開、Enter/空白鍵選取、Esc 關閉 (#15)

🔄 變更 (Changed)

  • 語系的權威改為網址:初始語系只由網址決定,localStorage 不再參與判定。這讓首次渲染與後續每一次導覽適用同一條規則——過去只有首次渲染是例外 (#15)
  • 語言切換器改為圖示樣式:翻譯字符加箭頭、不再顯示語系文字,與站台其他頁面的內建切換器一致;目前使用中的語系移到下拉選單頂端作為標題 (#15)
  • 題目頁導覽列的「文件」連結改指向指南頁:原本的目標路徑在站台結構中不存在 (#15)
  • 專案身分連結改指向本 repo:本專案由上游模板複製而來,站台、package.json、README 與貢獻指南中多處連結仍指向上游。CHANGELOG 內因 Markdown 連結標籤是扁平命名空間而錯指到上游同號 PR 的引用也一併修正 (#13)

🐛 修復 (Fixed)

  • 繁體中文題目頁的導覽連結會把你丟回英文版:返回、首頁與文件三個連結都寫死不看目前語系,連文字也是寫死的英文。三個連結現在都跟著頁面語系,標籤也一併翻譯。三者皆由同一份語系前綴規則推導,不再各寫各的 (#15)
  • 語言切換器在繁體中文下逐字斷行:中日韓文字的任兩字之間都是合法斷點,拉丁單字內部則沒有——同一段樣式因此在英文下永遠正常、在中文下必定折行。改為圖示樣式後不再有可折行的內容 (#15)
  • 導覽列的中文頁面會混雜英文字串:返回連結、筆記按鈕與執行環境狀態提示在中文頁的靜態 HTML 中仍是英文。現在導覽列的每一個文字都跟著頁面語系,包含螢幕閱讀器讀到的名稱 (#15)
  • 行動版的圖示按鈕沒有可及名稱:選單按鈕完全沒有名稱,返回與筆記按鈕在窄視窗下因文字被隱藏而名稱為空,螢幕閱讀器只能唸出符號。三者都已補上 (#15)

🗑️ 移除 (Removed)

  • 全站不再提供 GitHub 連結:兩個語系的導覽列設定皆已移除,題目頁的導覽列元件也不再具備渲染外部連結的能力——即使設定被還原,連結也不會回來 (#14)
  • Terminal 的對外表面已退役:兩份 Terminal 使用指南移至 .archive/guide/(仍在版本控制內,但不再建置成頁面),導覽列項目與八份文件中的相關說明一併清除。題目的 tools 欄位不再接受 terminal;現行三題都沒有啟用它,既有題目不受影響。若你的 fork 仍依賴 Terminal,請於升級前保留副本 (#14)

⚠️ 升級須知

一項使用者可見的行為變更:若你曾經瀏覽過繁體中文頁面,之後直接開啟不帶語系前綴的網址時,網址會自動改成中文對應頁一次。這取代了舊有的「位址列顯示英文網址、畫面卻是中文」的狀態。要固定取得某個語系,請直接使用帶前綴的網址——那類網址不會被導向。

本次沒有任何題目變動,題目資料格式也未改變。

What's Changed

  • 🚀 release: 1.4.0 上 production——語系改由網址決定,並移除 GitHub 連結與 Terminal 的對外表面 by @CXPhoenix in #22

Full Changelog: v1.3.0...v1.4.0