💡 先搞懂問題:為什麼需要一份「十大清單」
一個網站要上線前,資安人員回報「系統有風險」,開發團隊接著會問:是哪一種風險、嚴不嚴重、先修哪一個?如果每個人用自己的說法描述問題,同一個漏洞在測試報告裡可能叫「越權」、在工單裡叫「權限 bug」、在廠商簡報裡又換一個名字,很難比較,也很難排優先順序。更常見的情況是,大家把注意力放在聽起來很厲害的攻擊手法上,卻忘了最常出事的其實是「忘記檢查這個人能不能看這筆資料」這類基本功。
OWASP(Open Worldwide Application Security Project,開放全球應用程式安全計畫,舊名 Open Web Application Security Project)是一個非營利的開放社群。它蒐集大量網頁應用程式的檢測資料,再加上業界從業人員的問卷意見,每隔幾年整理出一份「網頁應用最重大的十類風險」,就是 OWASP Top 10。它不是法規,也不是完整的安全標準,而是一份讓開發、測試、管理三方有共同語言的「優先注意清單」。
打個比方:消防局每年公布「住宅火災十大原因」,第一名是電線走火,第二名是爐火忘了關。住戶不需要讀懂燃燒理論,只要照著清單一項一項檢查家裡,就能擋掉大部分的起火可能。
回到資安,火災原因統計對應的是 OWASP 從測試資料歸納出的弱點類型;「十大原因」對應 A01 到 A10 這十個類別;住戶照清單自我檢查,對應開發與測試時逐項對照自己的系統。
這個比喻有兩個地方容易誤會。第一,火災原因多半是單一事件,但 OWASP 的每一項是「一大類弱點」,底下包含許多具體的弱點類型(以 CWE 編號表示),例如「注入」底下就有 SQL 注入、命令注入、XSS 等。第二,清單只列出最常見、影響最大的十類,清單外的問題(例如業務邏輯漏洞)一樣會出事,所以它適合當起點,不適合當「全部做完就安全」的終點。
一次網頁請求,十大風險各埋在哪裡
下面把一個典型網站畫成一張圖:使用者從瀏覽器送出請求,經過登入、應用程式、資料庫,旁邊還有設定、第三方元件、更新管線和日誌。點圖上任一個標籤,看那一類風險出在什麼位置(標籤用 2021 版編號,考題多半用這一版)。
外圍虛線框代表「設計」:A04 不是某個元件,而是整張藍圖有沒有先想過會被怎麼濫用。灰色虛線標籤是 2025 版新增的類別。
點左邊(手機在上方)的任一標籤
每個標籤都是一類風險出現的位置。你會發現大部分風險和「攻擊技巧」無關,而是權限沒檢查、設定沒關好、元件沒更新這類管理與寫法上的疏忽。
🎮 互動實驗室
五個實驗室由淺入深:先認識兩個版本的十張卡片,再動手重現最常見的越權、把漏洞分到正確類別、關掉組態錯誤,最後比較危險寫法與安全寫法。所有畫面都是頁面內的假資料,不會連到任何真實網站。
1十格卡片牆:2021 與 2025 切換
切換版本,看十張卡片怎麼重新排列。每張卡右上角的小標籤告訴你這一類在另一版的位置;點任一張卡,下方會用白話說明「是什麼問題、真實情境、怎麼防」。
點一張卡片看說明
建議先從 A01 看起,它在兩版都排第一。
排名怎麼移動:兩版對照連線圖
橘色實線=排名上升,灰色實線=下降,淺灰=名次不變,虛線=併入其他類別;右側深色字的 A10 是 2025 新增類別。點圖上任一個類別名稱,會同步選取上方的卡片。
2IDOR 越權模擬:改一個數字就看到別人的訂單
你以會員「小美」(會員編號 M-207)登入一個虛構的購物網站,自己的訂單是 1040 和 1043。試著把網址最後的訂單編號改成別的數字,再切換伺服器的三種寫法,看結果有什麼不同。這種「換掉請求裡的物件編號就拿到別人資料」的漏洞叫 IDOR(Insecure Direct Object Reference,不安全的直接物件參照),在 API 領域也稱 BOLA,屬於 A01 存取控制失效。
時序圖:每送出一次請求,箭頭會依序走一遍。只有寫法 ③ 會出現中間那道「擁有者檢查」。
3分類遊戲:這個漏洞屬於哪一項
每一關是一段虛構的事件描述,請選出它最符合的類別。可以切換用 2021 或 2025 版的編號作答;同一個事件在兩版的編號可能不一樣,這正是新舊版最容易搞混的地方。
4組態錯誤檢查清單:把開著的門一扇扇關上
下面是一台「準備上線」的虛構網站伺服器,程式碼本身沒有漏洞,但設定有八個常見疏失。勾選你要修正的項目,風險分數會即時下降(分數與權重為教學示意,不是正式評分方法)。
上方是風險儀表;下排八扇門對應左邊八個項目,紅色表示還開著,修正後變成綠色關上。
5安全寫法 before/after:六個原則各跑一次
選一個原則,左邊是常見的危險寫法、右邊是修正後的寫法(虛構的精簡程式,類 Python 語法),紅底與綠底標出差異所在。再點下方的測試輸入,比較兩種寫法跑出來的結果。
📘 原理補完:把比喻接回技術細節
清單是怎麼排出來的
OWASP 先向資安廠商與測試團隊蒐集大量應用程式的檢測結果,把每個發現對應到 CWE(Common Weakness Enumeration,通用弱點列舉)這種「弱點類型編號」,再把相關的 CWE 歸成類別,綜合發生率、可利用性、影響等因素排序。
但測試資料只看得到「工具已經會測」的問題,新興風險往往還沒反映在數據裡。所以十個類別中只有八個由資料決定,另外兩個由業界從業人員的社群問卷選出。2021 版由問卷選出的是 A09 記錄監控失效與 A10 SSRF;2025 版則是 A03 軟體供應鏈失效與 A09 記錄告警失效。記錄類問題很難用自動化工具測出來,所以連續幾版都是靠問卷擠進榜內。
理解這個做法有助於判斷:排名反映的是「常見而且影響大」,不代表排第十的就可以忽略,也不代表每個網站的第一大風險都一定是 A01。
虛線框代表測試資料看不到、由從業人員投票補進來的類別。
2021 → 2025 改了什麼
2025 版於 2025 年 11 月在 OWASP Global AppSec USA 大會以候選版(Release Candidate)公布,目前 OWASP 官方專案頁已將它列為最新發布的版本。不過國內考題多半仍沿用 2021 版的編號,作答時先看題目寫的是哪一版;沒寫版本時,以 2021 版理解最保險。兩版最重要的變化有三個:SSRF 併入 A01 存取控制失效;「危險或過舊的元件」擴大成「軟體供應鏈失效」並升到第三;新增「例外狀況處理不當」。其餘多半是名次移動或名稱微調。
| 2021 版 | 2025 版 | 變化重點 |
|---|---|---|
| A01 存取控制失效 | A01 存取控制失效 | 仍居第一,並把 SSRF 納入同一類 |
| A02 加密機制失效 | A04 加密機制失效 | 下降兩名,內容不變 |
| A03 注入 | A05 注入 | 下降兩名,仍包含 SQL 注入、命令注入、XSS |
| A04 不安全設計 | A06 不安全設計 | 下降兩名 |
| A05 安全設定錯誤 | A02 安全設定錯誤 | 上升三名,雲端與容器讓「設定」決定越來越多行為 |
| A06 危險或過舊的元件 | A03 軟體供應鏈失效 | 範圍擴大:不只元件有漏洞,還包括建置系統、套件庫與散佈管道被入侵 |
| A07 識別與驗證失效 | A07 驗證失效 | 名次不變,名稱精簡 |
| A08 軟體及資料完整性失效 | A08 軟體或資料完整性失效 | 名次不變 |
| A09 安全記錄及監控失效 | A09 安全記錄及告警失效 | 名次不變,改名強調「告警」:有紀錄但沒人被通知,等於沒記錄 |
| A10 伺服端請求偽造(SSRF) | (併入 A01) | 不再單獨列項 |
| (無) | A10 例外狀況處理不當 | 新類別:錯誤處理不當、出錯時預設放行、交易做一半沒回滾 |
中文名稱為本頁採用的常見譯名,各單位譯法略有差異(例如「存取控制失效」也有人譯作「權限控制失效」);對照時以英文原名與編號為準。
注入、XSS 與 CSRF:這裡只簡短帶過
注入(Injection)的共同根源是「把使用者輸入當成指令的一部分」,包含 SQL 注入、作業系統命令注入、LDAP 注入等;2021 版起,跨站腳本 XSS 也併入注入類。對策的核心是讓指令與資料分開:資料庫用參數化查詢,顯示到頁面時做輸出編碼,所有輸入在伺服器端驗證。CSRF(跨站請求偽造)則不屬於注入類,它是借用受害者已登入的身分送出非本意的請求,在 OWASP 的弱點對應裡被放在存取控制相關的類別。這三種攻擊的逐步模擬與防禦,請看〈SQL 注入、XSS 與 CSRF〉互動教學。
存取控制與驗證:兩道不同的門
A07 驗證失效和 A01 存取控制失效最常被混在一起。驗證(Authentication)回答「你是誰」,是大門口的警衛核對證件;授權與存取控制(Authorization / Access Control)回答「你可以做什麼、看哪些資料」,是進門後每一間辦公室的門禁。
實驗室 2 的小美已經正常登入,驗證這一關完全沒問題;出事的是登入之後,伺服器沒有檢查「訂單 1041 是不是她的」。所以改網址看到別人資料屬於 A01,不是 A07。反過來說,弱密碼、不擋撞庫、登出後工作階段(session)沒失效,讓人冒用身分進門,才是 A07。
存取控制的原則是「預設拒絕」:除了公開資源,每個請求都要在伺服器端檢查身分與資料歸屬。把按鈕藏起來、在前端 JavaScript 判斷權限,都只是介面效果,攻擊者可以直接送請求繞過。
①是大門警衛,②是每一間房的門禁。A01 出事的位置在②。
SSRF:讓伺服器替攻擊者跑腿
很多網站有「貼上網址,由伺服器去抓內容」的功能,例如用網址匯入大頭貼、產生連結預覽。伺服器通常位在防火牆內側,看得到外人看不到的內部網路;如果它不檢查目的地,攻擊者就能把網址換成內網管理介面或雲端主機的中繼資料服務(可能含有臨時憑證),讓伺服器替他去讀,再把結果帶回來。這就是 SSRF(Server-Side Request Forgery,伺服端請求偽造),2021 版的 A10。2025 版把它併入 A01,理由很直接:本質上是伺服器替使用者存取了他沒有權限存取的資源。
上方是網際網路,虛線是防火牆,下方是內部網路。按「下一步」讓請求一段一段走。
第 0 步:準備
網站提供「用網址匯入圖片」功能。防火牆只允許外部連到網站伺服器的 443 埠,內網管理介面從外面是連不到的。
防禦重點:在伺服器端用白名單限制可連的網域、協定與埠;把應用伺服器對內網的連線用網路分段隔開;不要把抓到的原始回應直接回傳;停用自動跟隨轉址。只用黑名單過濾「內網 IP 字串」不夠,同一個位址有很多種寫法,也可能透過轉址或 DNS 繞過。
供應鏈(A06 → A03)與完整性(A08)
現代網站的程式碼大部分來自開源套件。2021 版的 A06「危險或過舊的元件」談的是用了已知有漏洞、或已停止支援的元件,而且常常連自己用了哪些都不知道;2021 年底 Log4j 漏洞(Log4Shell)爆發時,許多組織花了好幾天才盤點出受影響的系統。2025 版把它擴大為 A03「軟體供應鏈失效」,範圍涵蓋整條鏈:套件庫被植入惡意版本、建置與 CI/CD 管線被入侵、更新伺服器被利用來散佈惡意程式。A08「軟體及資料完整性失效」則聚焦在一個動作:拿到程式或資料時,有沒有驗證它的來源與完整性(例如更新檔沒驗證數位簽章就安裝、從不受信任的來源載入腳本、反序列化不受信任的資料)。
點鏈上的任一環,看這一環可能出什麼事、該怎麼防。左側橘色長條代表 2025 版 A03 涵蓋的範圍。
點左邊(手機在上方)的任一環
從開源套件庫一路到使用者安裝更新,每一環都可能被攻擊者利用,自己寫的程式再安全也擋不住。
對應的管理工具:SCA(軟體組成分析)自動找出用了哪些元件並比對已知漏洞;SBOM(軟體物料清單)是元件清單本身;數位簽章與來源證明確認「這個檔案真的是那個人建出來、沒被改過」。細節可看地圖上的「SCA、SBOM 與供應鏈」節點。
2025 新增:例外狀況處理不當
程式在正常情況下都跑得對,問題常出在「不正常」的時候:參數缺了、資料庫連不上、磁碟滿了、交易做到一半失敗。2025 版新增的 A10「例外狀況處理不當」(Mishandling of Exceptional Conditions)專門收這類問題,典型情況有三種:錯誤訊息把資料表名稱、程式路徑、堆疊追蹤(stack trace)等內部資訊洩漏給使用者;出錯時預設放行(fail open);多步驟交易失敗卻沒有整筆回滾,例如已經扣款卻沒入帳。
對策是在錯誤發生的地方就處理,出錯時預設拒絕(fail closed)並整筆回滾;對使用者只顯示一般訊息,詳細內容寫進日誌;再用限速與資源配額,避免資源被耗盡。要注意,2021 版考題把「錯誤頁面顯示堆疊追蹤」當作 A05 安全設定錯誤的典型例子,看到這類題目時仍以題目採用的版本判斷。
同一個錯誤,兩種處理方式。安全上的預設值應該是右邊。
安全程式寫法六原則
上面各類風險,落到寫程式的層次,可以收斂成六個習慣。它們各守一個位置,彼此不能互相取代:做了輸入驗證,仍然要用參數化查詢與輸出編碼;前端檢查只是為了使用者體驗,真正的檢查一定在伺服器端。實驗室 5 可以逐一比較修正前後的寫法。
左欄是資料往下走進資料庫,右欄是資料往上回到畫面。點任一個編號看說明。
點圖上的編號
六個原則分別守在資料流的不同位置:入口、查詢、輸出、連線身分、錯誤處理與機敏資料保管。
易混淆整理
OWASP 另有針對不同對象的清單,例如 API Security Top 10(2023 版第一名是物件層級授權失效 BOLA,也就是 API 版的 IDOR)、Mobile Top 10、LLM 應用 Top 10;要逐條驗證應用程式安全要求時,則用 ASVS(應用程式安全驗證標準)。Top 10 是風險意識清單,ASVS 才是可以拿來驗收的標準。
✅ 自我檢測
六題情境題,點選答案後會立刻顯示對錯與解析。
🎯 重點整理:考前 30 秒版
- OWASP Top 10 是網頁應用最常見、影響最大的十類風險清單,用來建立共同語言與排優先順序;它不是完整標準,要逐條驗收應用程式安全要求用 ASVS。
- 2021 版依序為:A01 存取控制失效、A02 加密機制失效、A03 注入、A04 不安全設計、A05 安全設定錯誤、A06 危險或過舊的元件、A07 識別與驗證失效、A08 軟體及資料完整性失效、A09 安全記錄及監控失效、A10 SSRF。
- 2025 版三大變化:SSRF 併入 A01;A06 擴大為 A03 軟體供應鏈失效;新增 A10 例外狀況處理不當。另外安全設定錯誤升到 A02。題目沒寫版本時,多半用 2021 編號。
- 改網址或參數中的編號就看到別人資料(IDOR/BOLA)屬於 A01,解法是伺服器端逐筆檢查資料歸屬、預設拒絕;隱藏按鈕或前端檢查都擋不住。
- 預設帳密未改、雲端儲存設成公開、正式環境開除錯模式屬於安全設定錯誤;HTTP 明文傳輸敏感資料、用無鹽 MD5 存密碼屬於加密機制失效。
- 注入包含 SQL、作業系統命令、LDAP 注入與 XSS,不包含 CSRF;根治方式是讓指令與資料分離。
- 安全寫法六原則:伺服器端輸入驗證(白名單)、參數化查詢、輸出編碼、最小權限、錯誤訊息不洩漏內部資訊、機敏資料不寫死在程式碼。