在寫程式的過程中,你是否想過以下問題:
-
使用者密碼是怎麼被盜走的?
-
SQL Injection 到底是什麼?
-
為什麼網站登入頁面要加上 CSRF Token?
-
檔案上傳功能怎麼防止惡意程式?
如果你只專注在功能開發,忽略了安全性,那麼你寫出來的程式可能早晚都會出現漏洞。
資訊安全不只是資安工程師的事,每一位開發者都需要懂得防禦基礎。
這篇文章將帶你快速入門資安的核心觀念與開發實務,幫助你寫出更安全的程式。
一、資安是什麼?為什麼你要在意?
資安(Cybersecurity)目的是保護資訊的機密性、完整性與可用性(簡稱 CIA 三要素)。
| 要素 | 說明 |
|---|---|
| 機密性(Confidentiality) | 防止未授權者取得資料 |
| 完整性(Integrity) | 確保資料未被未授權更動 |
| 可用性(Availability) | 確保系統服務正常可用 |
資安不是可有可無,而是你系統活著的前提。
二、常見攻擊手法與防禦觀念
1. SQL Injection
當輸入值被直接拼接進 SQL 查詢時,攻擊者可能送出:
' OR '1'='1
導致原本的查詢邏輯被繞過。
防禦方法:
-
一律使用參數化查詢(Prepared Statement)
-
不要直接拼接字串組成 SQL
2. XSS(跨站腳本攻擊)
攻擊者將 JavaScript 代碼注入到頁面中,例如留言板中塞入:
<script>alert('XSS')</script>
當其他使用者打開頁面時,就會被執行。
防禦方法:
-
對輸入進行編碼處理(HTML Escaping)
-
使用 Content Security Policy(CSP)
3. CSRF(跨站請求偽造)
使用者在登入狀態下,點了攻擊者提供的連結,導致系統誤認並執行敏感操作。
防禦方法:
-
表單中加上 CSRF Token
-
驗證請求來源 Referer 或 Origin 標頭
三、密碼儲存的正確做法
千萬不能用明碼儲存密碼!
正確流程應如下:
-
使用者輸入密碼
-
使用強雜湊函式(如 bcrypt, Argon2)進行雜湊處理
-
儲存雜湊值(含 salt)
Node.js 範例:
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash(plainPassword, 10);
const match = await bcrypt.compare(inputPassword, hash);
四、資安開發建議
-
輸入驗證要做雙層:前端限制 + 後端驗證
-
所有檔案上傳都要檢查 MIME 類型與副檔名
-
所有 API 都要驗證權限與身份(token 驗證)
-
錯誤訊息不要回傳敏感資訊(如 stack trace)
五、資安測試工具簡介
| 工具 | 功能 |
|---|---|
| OWASP ZAP | 網頁應用程式弱點掃描 |
| Burp Suite | 攔截、重送、測試 HTTP 請求 |
| SQLMap | 自動化 SQL Injection 掃描 |
| Hashcat | 密碼雜湊暴力破解 |
| Nikto | 掃描 Web 伺服器設定與漏洞 |
你可以先從 OWASP ZAP + DVWA(測試用漏洞站)開始練習。
結語:資安從來不是別人的責任,而是每位開發者的基本素養
你不需要是專職資安工程師,但你寫的每一行程式碼,都是潛在的入口。
從最常見的漏洞開始了解,從正確的 API 設計與資料儲存方式做起,
你就能讓系統更安全、更可靠,也讓自己的技能更加完整。
評論