Home
探索 Uedu
學生控制台
註冊會員/登入
研究知情同意中心
教師控制台
課程設定
支援與訊息
Uptime 數據

UeduGPTs

--

Jupyters

4

UG26 CISOSE26
臺北 AQI 46 · 臺中 AQI 26 · 臺南 AQI 21 · 高雄 AQI 33

AI 回覆桌面通知

AI 助教回覆完成時顯示桌面通知

聊天訊息通知

同學在討論區發送訊息時通知

聲音通知

每當有新通知時播放提示音

資安威脅與防護

資安威脅與防護

從一封凌晨三點的釣魚信出發,認識惡意程式、社交工程、SQL injection 與 XSS,並以 CIA 三要素、防禦縱深、最小權限與零信任建立完整防護觀。

凌晨三點的一封信

凌晨三點,某位學生收到一封標題寫著「您的選課系統帳號異常,請立即驗證」的電子郵件。信裡的標誌、字體、配色都和學校官網一模一樣,連結也煞有介事地寫著一串網址。半夢半醒之間,他點了進去,輸入了學號與密碼。第二天醒來,他才發現那封信根本不是學校寄的,連結指向的也不是學校的伺服器。短短一夜,攻擊者就拿到了他的帳號。

這個故事裡沒有出現任何高深的駭客技術,沒有破解任何加密演算法,甚至連一行惡意程式碼都沒有。攻擊者只是利用了「人會疲倦、會信任熟悉的外觀」這件事。資訊安全(information security)的核心,從來就不只是技術問題,而是技術、流程與人三者交織的系統性課題。這一篇,我們就從這封凌晨三點的信開始,看看威脅如何發生,以及我們能用哪些原則去防護。

為什麼會有資安威脅

要談防護,得先理解「我們到底在保護什麼」。資安領域用一個經典的三角來概括防護目標,稱為 CIA 三要素:

  • 機密性(Confidentiality):資料只能被授權的人看到。學生的成績、健康數據、私訊,不該被無關第三方讀取。
  • 完整性(Integrity):資料不被未授權地竄改。銀行帳戶餘額、考試分數、程式碼,必須確保沒有被偷偷改動。
  • 可用性(Availability):合法使用者需要時,系統就能正常運作。選課系統在選課當天當機,即使資料沒外洩、沒被改,也是一種安全失效。

任何一次攻擊,本質上都是在破壞這三者之一或多者。把資料偷走破壞機密性、把網頁竄改破壞完整性、把伺服器灌爆(DDoS)破壞可用性。記住這個框架,你就有了一把分類所有威脅的尺。

資訊安全與計算理論概念示意圖

惡意程式:自動化的威脅

惡意程式(malware)是泛指一切「設計來造成傷害」的軟體。依其行為與傳播方式,常見類型包括:

類型 核心特徵
病毒(virus) 附著在正常檔案上,需使用者執行才能傳播
蠕蟲(worm) 能自我複製、跨網路主動散播,不需人為觸發
木馬(trojan) 偽裝成有用程式,誘使使用者自行安裝
勒索軟體(ransomware) 加密受害者檔案,要求贖金才解密
間諜軟體(spyware) 暗中竊取鍵盤輸入、瀏覽紀錄等資料
殭屍網路(botnet) 將大量受感染主機編成網路,供攻擊者遠端操控

這裡有一個常見迷思值得澄清:「病毒」常被當成所有惡意程式的代名詞,但嚴格來說,病毒只是其中一類,其關鍵在於「依附宿主檔案、需要被執行」。蠕蟲與它最大的差別在於蠕蟲能自己跨網路跑,這也是為什麼歷史上幾次大規模感染事件擴散得如此之快。

社交工程:攻擊「人」這個介面

技術防線再強,只要有人願意親手把鑰匙交出去,一切就破功了。社交工程(social engineering)正是利用人性弱點(信任、恐懼、急迫感、好奇心)來繞過技術防護的手法。開頭那封凌晨三點的信,就是最典型的釣魚(phishing)。

釣魚的常見變體包括:

  • 一般釣魚:大量亂槍打鳥的假信件,假冒銀行、學校、購物平台。
  • 魚叉式釣魚(spear phishing):針對特定個人客製化,可能引用你真實的名字、課名、同學,可信度極高。
  • 網域偽冒(typosquatting):用 examp1e.com(把 l 換成數字 1)這類肉眼難辨的網址混淆視聽。

防禦社交工程的關鍵不在更強的演算法,而在習慣與制度:對「製造急迫感」的訊息保持警覺、養成從官方管道二次確認的習慣、不在來路不明的連結輸入密碼。攻擊者賭的是你「來不及多想」,而你的反制就是「永遠留一秒去懷疑」。

兩種典型的程式漏洞:SQL injection 與 XSS

當攻擊目標從「人」轉向「程式」時,最經典的兩類網頁漏洞是 SQL injection 與 XSS。它們的共同根源是同一個錯誤:把使用者輸入的資料,當成程式指令來執行

SQL injection(資料隱碼攻擊) 發生在後端把使用者輸入直接拼接進資料庫查詢時。想像一段不安全的登入查詢:

# 危險寫法:把使用者輸入直接拼進 SQL 字串
username = request.form['username']
sql = "SELECT * FROM users WHERE name = '" + username + "'"
cursor.execute(sql)

如果使用者在帳號欄位輸入 ' OR '1'='1,拼接後的查詢會變成:

SELECT * FROM users WHERE name = '' OR '1'='1'

因為 '1'='1' 永遠為真,這條查詢會回傳整張使用者表,登入驗證形同虛設。正確的防禦是使用參數化查詢(parameterized query),讓資料庫把輸入永遠當成「資料」而非「指令」:

# 安全寫法:參數化查詢
cursor.execute("SELECT * FROM users WHERE name = %s", (username,))

XSS(跨站腳本攻擊,Cross-Site Scripting) 則發生在前端。如果網站把使用者輸入的內容(如留言)原封不動地塞進網頁,攻擊者就能注入一段 <script> 程式碼,讓其在其他訪客的瀏覽器中執行,藉此竊取登入憑證(cookie)或冒名操作。防禦之道是輸出轉義(output escaping):把 <>& 等特殊字元轉成無害的顯示符號,讓瀏覽器把它當文字而非程式碼。現代模板引擎(如 Jinja2)預設會自動轉義,前端再搭配內容清洗工具與內容安全政策(Content Security Policy, CSP)做縱深防護。

動手看一個例子

讓我們用一個具體的「攻擊與防禦對照」,看清楚輸入過濾的差別。假設一個留言板要顯示使用者送來的內容:

使用者輸入:<script>steal(document.cookie)</script>
處理方式 網頁實際內容 結果
直接輸出(不轉義) <script>steal(document.cookie)</script> 瀏覽器執行腳本,cookie 被偷
輸出轉義後 &lt;script&gt;steal(...)&lt;/script&gt; 瀏覽器當作純文字顯示,無害

逐步來看轉義做了什麼:

  1. 接收輸入字串。
  2. < 替換為 &lt;> 替換為 &gt;& 替換為 &amp;
  3. 瀏覽器看到 &lt; 時,只會「畫出」一個小於號給人看,而不會把它解讀成標籤的開始。

關鍵心法只有一句話:永遠區分「資料」與「指令」。無論是 SQL 還是 HTML,只要這條界線被打破,漏洞就誕生了。

防禦縱深:不把雞蛋放在同一個籃子

沒有任何單一防線是萬無一失的。防火牆會有漏洞、密碼會外洩、員工會被騙。防禦縱深(defense in depth)的思想,是假設「每一層都可能被突破」,因此疊加多層獨立的防護,讓攻擊者必須連續攻破每一層才能得手。

以一個校園系統為例,由外而內可能有:

  • 網路層:防火牆過濾異常流量、入侵偵測系統(IDS)監控。
  • 應用層:參數化查詢防 SQL injection、輸出轉義防 XSS、輸入長度與型別驗證。
  • 認證層:密碼雜湊儲存、雙因素驗證、登入失敗次數限制。
  • 資料層:敏感資料加密、權限分級、操作稽核日誌。

每一層都假設前一層已被攻破,這正是縱深的精神。

密碼與雙因素驗證

最後一道、也最貼近個人的防線,是身分驗證。關於密碼,有幾個必須建立的正確觀念:

  • 網站不該明文儲存密碼:而應儲存經過加鹽雜湊(salted hash)後的值。雜湊是單向的,即使資料庫外洩,攻擊者也無法直接還原出原始密碼;「加鹽」則是為每個密碼加上隨機字串,讓相同密碼產生不同雜湊,瓦解預先計算好的破解字典。
  • 密碼長度比複雜度更重要:一串夠長的多詞通關語,往往比短而充滿符號的密碼更難破解,也更好記。
  • 不要重複使用密碼:一旦某個小網站外洩,攻擊者會拿同一組帳密去嘗試你所有其他帳號(稱為憑證填充, credential stuffing)。

而真正能大幅提升安全的,是雙因素驗證(Two-Factor Authentication, 2FA)。它的原理是要求「兩種不同類別」的證明:

  • 你知道的東西(密碼)。
  • 你擁有的東西(手機上的動態驗證碼、實體安全金鑰)。
  • 你本身的特徵(指紋、臉部)。

即使密碼被釣魚偷走,攻擊者少了你手中那支手機,依然進不來。這就是為什麼開頭那位學生若有啟用 2FA,那場凌晨的攻擊很可能就此止步。

重點回顧

  • 資安的目標可用 CIA 三要素概括:機密性、完整性、可用性。任何攻擊本質上都在破壞其中之一。
  • 惡意程式有病毒、蠕蟲、木馬、勒索軟體等不同類型,關鍵差異在於是否需要宿主檔案、能否自我傳播。
  • 社交工程(如釣魚)攻擊的是「人」,技術防線再強也擋不住自願交出密碼,反制靠習慣與二次確認。
  • SQL injection 與 XSS 同源於「把資料當指令執行」,防禦核心是參數化查詢與輸出轉義,永遠分清資料與指令。
  • 防禦縱深疊加多層獨立防護;個人層面則靠加鹽雜湊密碼、長通關語與雙因素驗證守住最後一關。

深入探討(研究所視角)

前面討論的防護,多半建立在一個傳統假設上:把系統分成「可信的內部網路」與「不可信的外部網路」,只要守住邊界(防火牆)就安全。但在雲端服務、遠距辦公、行動裝置普及後,這個「城堡與護城河」模型已經失效——一旦攻擊者突破邊界進入內網,往往就能在內部橫向移動(lateral movement)、暢行無阻。研究所層級的資安設計,因此圍繞兩個更深刻的原則展開。

最小權限原則(Principle of Least Privilege, PoLP) 主張:每一個主體(使用者、程序、服務)都應只被賦予「完成其任務所必需的最小權限」,不多給一分。其理論意義在於壓縮攻擊面(attack surface)與爆炸半徑(blast radius)——當某個帳號或元件被攻破時,攻擊者所能造成的損害被限制在該元件原本就有的權限範圍內。這個原則可以形式化地理解:若系統狀態的可達性圖中,每個節點的出邊(可存取的資源)愈少,從任一受損節點能擴散到的子圖就愈小。實務上它對應到角色存取控制(Role-Based Access Control, RBAC)、權限的定期回收、以及「預設拒絕(deny by default)」的設定哲學——先全部關閉,再逐項開放確實需要的。

零信任架構(Zero Trust Architecture, ZTA) 則是把最小權限原則推到極致並重構整個信任模型。它的核心箴言是「永不信任,持續驗證(never trust, always verify)」:不再因為某個請求「來自內網」就給予信任,而是對每一次資源存取都重新驗證身分、檢查裝置狀態、評估情境風險。零信任有三條支柱值得記住:(1) 明確驗證每次存取,而非一次登入後永久放行;(2) 採用最小權限,並對敏感操作要求即時(just-in-time)、足夠用(just-enough)的權限提升;(3) 假設已被入侵(assume breach),因此進行微分段(micro-segmentation),把網路切成許多小區塊,限制橫向移動,並對所有流量加密與記錄。

把這兩者放回前面的脈絡,你會看到它們如何彼此呼應:CIA 三要素定義了「我們要保護什麼」,防禦縱深提供了「疊加多層」的戰術,而最小權限與零信任則是更上位的架構哲學,決定了每一層該如何設計信任邊界。從計算理論的角度看,這也與存取控制的可判定性、安全策略的形式化驗證(如以狀態機模型證明「機密資訊永不流向低密級主體」的不干擾性, non-interference)等議題相連結。資安從來不是裝一套防毒軟體就結束的事,而是一門需要在「可用性」與「安全性」之間持續權衡、不斷演進的系統工程。

AI 共讀助教正在陪你讀:資安威脅與防護
嗨!我是這篇文章的共讀助教,只根據〈資安威脅與防護〉的內容回答。可以問我「解釋某段」「舉個例子」「出題考我」,或反白文中段落後點下方「解釋選取段落」。