Home
Explore Uedu
Student Console
Register as Member/Login
(2) In future presentations of the research findings, in addition to the course project website and public presentations, your real name and personal information will not appear in this research report. If you are interested in the research results, we can provide you with an executive summary after the study is completed.
問卷中心
Teacher Console
Course Setup
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

0

Local AI

--

CISOSE26 本地 AI UG26
政治大學 AQI 18 29°C

AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

資安威脅與防護

資安威脅與防護

從一封凌晨三點的釣魚信出發,認識惡意程式、社交工程、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 共讀助教正在陪你讀:資安威脅與防護
嗨!我是這篇文章的共讀助教,只根據〈資安威脅與防護〉的內容回答。可以問我「解釋某段」「舉個例子」「出題考我」,或反白文中段落後點下方「解釋選取段落」。