學習 ORM 與上傳檔案漏洞
ORM
ORM 是什麼
ORM(Object-Relational Mapping,物件關聯對應)是一種程式設計技術,用來在物件導向程式語言與關聯式資料庫之間建立對應的關係。
透過 ORM,開發者可以以物件的方式來操作資料庫中的資料,而不需要直接撰寫 SQL 查詢語句。
ORM 工具會自動將程式中的物件屬性對應到資料庫的資料表與欄位,簡化資料庫操作的流程。
重點
- 建立資料庫的對應關係
- 可使用物件操作資料庫資料
- 不需要寫 SQL 查詢與據
- 自動化對應資料表與資料欄位
- 簡化資料庫操作
為什麼要使用 ORM
使用 ORM 的原因如下:
-
提高開發效率:使用 ORM 工具,開發者可以專注於業務邏輯,而不用花太多時間在撰寫複雜的 SQL 語句上。透過自動化的資料庫映射,ORM 減少了程式碼重複,並且讓開發變得更直觀。
-
跨資料庫兼容性:大多數的 ORM 工具支援多種關聯式資料庫,如 MySQL、PostgreSQL、SQLite 等。這讓程式可以更容易在不同的資料庫之間切換,而不需要重寫查詢語句。
-
可讀性與維護性:ORM 工具提供的 API 讓程式碼更具可讀性,降低了程式碼中出現錯誤的機會,也讓維護變得更加容易。
-
資料驗證:ORM 通常內建資料驗證功能,可以確保資料在存入資料庫前符合特定的條件與規範。
ORM 會有資安風險嗎
ORM 雖然提供了很多便利性,但在使用上可能仍然存在一些資安風險,包括:
-
SQL Injection(SQL 注入):雖然 ORM 工具預設提供了防範 SQL 注入的機制,但如果開發者在操作 ORM 時沒有使用預防措施(如使用不當的原始 SQL 查詢功能),還是可能會暴露在 SQL 注入攻擊的風險之中。
-
過度信任 ORM 自動生成的查詢:有時 ORM 生成的 SQL 查詢語句可能不是最佳化的,可能導致性能問題,甚至可能在某些情況下暴露敏感資料。
-
資料庫結構變更風險:如果沒有正確管理資料庫遷移(migration),ORM 在操作資料庫時可能會破壞現有的資料或結構,導致資料損失或系統不穩定。
因此,開發者在使用 ORM 時,應保持對安全性的關注,並確保遵循良好的程式開發實踐。
Node.js Sequelize
Sequelize 是 Node.js 中一個常見的 ORM 工具,它支援多種資料庫,如 MySQL、PostgreSQL、SQLite 和 MariaDB。Sequelize 提供了簡單易用的 API,讓開發者可以輕鬆地操作資料庫,進行 CRUD 操作(建立、讀取、更新、刪除)。
Sequelize 的一些特點包括:
-
模型定義:Sequelize 允許開發者以物件模型的方式定義資料表結構,並自動處理資料表之間的關聯性(如一對多、多對多關聯)。
-
查詢生成:Sequelize 自動生成 SQL 查詢語句,開發者不需要直接撰寫 SQL,大大減少了錯誤發生的可能性。
-
資料驗證:Sequelize 支援多種資料驗證規則,確保資料在進入資料庫前符合預設規範。
-
遷移工具:Sequelize 提供了資料庫遷移工具,幫助管理資料庫結構的變更。
網站上傳功能情境
什麼時候會有上傳功能
網站的上傳功能常見於下列情境:
-
使用者上傳檔案:例如使用者在社群媒體上傳個人照片、文件或影片等檔案。
-
表單提交附件:像是線上報名表或聯繫表單中,允許使用者上傳相關的文件作為補充資料,例如履歷表、申請文件等。
-
儲存內容資料:企業或系統管理者上傳報表、備份檔案、產品圖片、手冊等。
-
檔案共享平台:如 Google Drive、Dropbox 等,允許使用者上傳檔案並與他人分享。
-
系統更新:例如管理員在網站後台上傳更新檔案或資料,以維護網站功能。
會有什麼風險
檔案上傳功能常伴隨一定的資安風險,主要風險包括:
-
惡意程式上傳:攻擊者可能上傳包含惡意程式碼的檔案(如木馬程式、Web shell),如果檔案未被正確過濾或檢查,攻擊者可能會利用此程式來入侵系統。
-
檔案類型偽裝:攻擊者可以透過修改檔案副檔名,將危險的可執行檔偽裝成無害的檔案格式(如將
.php
程式碼檔案偽裝成 .jpg
圖片檔),一旦被伺服器執行,可能導致網站被攻擊。
-
資料洩露:如果上傳的檔案包含機密資訊,如企業內部文件或使用者隱私資料,這些資料若未妥善保護,可能會被未經授權的使用者存取或下載,導致資料洩露。
-
DDoS 攻擊:攻擊者可以上傳過大或大量檔案,試圖耗盡伺服器資源,造成系統崩潰或拒絕服務(Denial of Service)。
攻擊面
- 任意上傳惡意檔案
- 任意下載他人檔案
- 取得敏感資料內容
- upload 上傳資料夾任意開放
- 上傳檔案未進行修改檔案名稱
實作
程式碼細項
https://github.com/fei3363/ithelp_web_security_2024/commit/cb4f2e6c4a6850285450e761bb7b596a5852d83f
目標
- 實作檔案上傳和管理系統
- 處理 ORM 相關設定
- 處理 gitignore 設定
檔案細項
- .gitignore
- 新增 upload/
- 避免將上傳的檔案加入版本控制
- docker-compose.yml
- 在 web 服務的指令新增
-
npm run db:migrate
- web/Dockerfile
- 安裝 sequelize-cli、PostgreSQL 和 MongoDB 相關套件。
- 建立 config 目錄
- web/config/config.js
- 新增 Sequelize 設定檔案
- 定義開發環境的資料庫連接設定
- web/controllers/fileController.js
- web/db/postgres.js
- 更新資料庫連接設定
- 新增 Sequelize 連線
- 新增測試連接功能
- web/migrations/20240926142740-create-file-table.js
- web/models/file.model.js
- 定義 File 模型
- 對應資料庫中的 file 表
- web/package.json
- 新增相依性
- sequelize
- sequelize-cli
- multer
- 新增 db:migrate 腳本
- web/routes/file.routes.js
- web/server.js
- web/views/upload.ejs
演練
- 進入頁面
- 查看訊息,可看到真實儲存路徑
- 觀察刪除 API
- 沒有進行任何驗證可直接刪除
總結
本篇文章深入探討了 ORM 技術的運作原理、使用優勢以及其潛在的資安風險,接著闡述了網站檔案上傳功能常見的攻擊面與風險。在開發過程中,ORM 大大簡化了資料庫操作,但同時應重視其潛在的安全問題。此外,網站上傳功能是攻擊者常見的進攻點,必須做好文件類型和大小限制,以及上傳資料的驗證,避免可能的攻擊。
小試身手
題目1:
ORM 是什麼的簡稱?
- A. Object-Reality Mapping
- B. Object-Relational Mapping
- C. Object-Resource Mapping
- D. Object-Retrieve Mapping
正確答案: B
解析: ORM 是 Object-Relational Mapping,意指將物件導向程式中的物件映射到關聯式資料庫的技術。
題目2:
使用 ORM 的主要優勢不包括哪一項?
- A. 提高開發效率
- B. 簡化資料庫操作
- C. 避免所有安全風險
- D. 增強程式碼可讀性
正確答案: C
解析: 雖然 ORM 簡化操作,但仍需注意安全風險,特別是 SQL 注入等問題。
題目3:
以下何者為常見的 ORM 工具?
- A. MongoDB
- B. Sequelize
- C. GraphQL
- D. Redis
正確答案: B
解析: Sequelize 是 Node.js 中常見的 ORM 工具,用來操作 SQL 資料庫。
題目4:
哪個風險是與網站檔案上傳功能有關的?
- A. SQL 注入
- B. 檔案類型偽裝
- C. 內部連線洩漏
- D. 缺少驗證
正確答案: B
解析: 攻擊者常透過偽裝檔案類型進行攻擊,例如將 .php
檔案偽裝成 .jpg
。
題目5:
為什麼 ORM 可能帶來性能問題?
- A. ORM 會直接運行資料庫中的惡意程式碼
- B. ORM 有時生成的查詢語句不是最佳化的
- C. ORM 無法支援大多數的資料庫
- D. ORM 必須依賴手動編寫查詢語句
正確答案: B
解析: ORM 自動生成的查詢語句有時並非最佳化,可能會影響系統性能。
實作清單與參考資源
實作清單
-
建立 ORM 模型:使用 Sequelize 定義資料庫結構。
-
檔案上傳系統:
- 檔案驗證:設定允許上傳的檔案類型與大小。
- 檔案存放:將上傳的檔案儲存在專門的目錄下,並確保目錄的安全性。
-
防範措施:
- 實作防止惡意程式碼的掃描機制。
- 實作檔案名稱隨機化以避免名稱衝突。
參考資源