# MOMO 監控系統 - 專案憲法 **版本:** 1.3 **制定日期:** 2026-01-12 **最後更新:** 2026-01-14 --- ## 📜 專案基本原則 本憲法定義了 MOMO 監控系統的開發規範、溝通原則、安全政策及技術標準。所有參與者(開發人員、AI 助手、維護人員)必須遵守以下規範。 --- ## 🗣️ 第一章:溝通規範 ### 第 1 條:語言使用 - **所有溝通一律使用繁體中文** - 包含但不限於: - 程式碼註解 - 文檔說明 - Commit 訊息 - 錯誤訊息 - 日誌輸出 - 使用者介面文字 - README 和文檔 ### 第 2 條:文檔規範 - 所有文檔檔案使用 Markdown 格式(`.md`) - 檔案名稱使用英文大寫加底線(例:`PROJECT_CONSTITUTION.md`) - 文檔內容必須包含版本號和最後更新日期 - 重要變更需記錄在 CHANGELOG 中 ### 第 3 條:註解規範 - Python 函數必須包含繁體中文 docstring - 複雜邏輯必須添加行內註解說明 - 註解應說明「為什麼」而非「做什麼」 --- ## 🔒 第二章:安全政策 ### 第 4 條:敏感資訊管理 - **禁止在程式碼中硬編碼任何敏感資訊** - 所有憑證、API 金鑰、密碼必須使用環境變數(`.env`) - `.env` 檔案必須列入 `.gitignore` - 提供 `.env.example` 作為範本 ### 第 5 條:密碼安全 - 所有密碼必須使用 `pbkdf2:sha256` 雜湊儲存 - 禁止使用明文密碼(僅過渡期允許,需發出警告) - 密碼長度至少 8 個字元,包含英文字母和數字 - 登入失敗 5 次後鎖定帳號 5 分鐘 ### 第 6 條:輸入驗證 - **所有使用者輸入必須經過驗證** - SQL 查詢必須使用參數化查詢或白名單驗證 - 檔案上傳必須驗證副檔名和檔案大小 - 路徑操作必須使用 `safe_join()` 防止路徑遍歷 ### 第 7 條:CSRF 防護 - 所有 POST/PUT/DELETE/PATCH 請求必須包含 CSRF token - HTML 表單使用 hidden input: `` - AJAX 請求使用 header: `'X-CSRFToken': getCSRFToken()` ### 第 8 條:Session 安全 - Session cookie 必須設定 `HttpOnly=True` - Session cookie 必須設定 `SameSite=Lax` - 生產環境必須設定 `Secure=True`(HTTPS) - Session 有效期設定為 2 小時 --- ## 💻 第三章:程式碼規範 ### 第 9 條:檔案上傳 - 僅允許上傳:`.xlsx`, `.xls`, `.csv` - 檔案大小限制:10 MB - 使用 `secure_filename_unicode()` 清理檔名(支援中文) - 檢查路徑遍歷攻擊(`..`, `/`, `\`) ### 第 10 條:SQL 安全 - 表名驗證:僅允許英文字母、數字、底線 - 欄位名驗證:允許中文、英文字母、數字、底線 - 時間戳驗證:嚴格遵守 `YYYY-MM-DD HH:MM:SS` 格式 - 使用 `safe_read_sql()` 進行安全的 SQL 查詢 ### 第 11 條:路徑安全 - 所有路徑拼接使用 `safe_join(base, *paths)` - 檢查 Windows 反斜線、連續點、雙點模式 - 驗證最終路徑在基礎目錄內 - 偵測到攻擊時記錄安全日誌 ### 第 12 條:日誌規範 - 使用結構化日誌格式:`[模組] [級別] 訊息 | 詳細資訊` - 安全事件使用 `[Security]` 標籤 - 記錄所有失敗的驗證嘗試 - 日誌級別: - `ERROR`: 系統錯誤 - `WARNING`: 安全警告、失敗的攻擊嘗試 - `INFO`: 重要操作成功 - `DEBUG`: 詳細除錯資訊 --- ## 🕷️ 第四章:數據爬取規範 ### 第 13 條:爬蟲程式碼穩定性原則 - **爬蟲程式碼屬於核心業務邏輯,修改時必須格外謹慎** - 任何修改必須經過完整測試,確認不影響現有爬取功能 - 修改前必須備份現有可運作的版本 - 修改後必須驗證所有爬蟲任務正常執行 ### 第 14 條:爬蟲選擇器維護 - **CSS 選擇器和 XPath 是脆弱的依賴** - 修改選擇器前必須: 1. 記錄修改原因(網站改版、元素變更等) 2. 測試新選擇器是否正確抓取目標資料 3. 保留舊選擇器作為註解備份 4. 記錄網站結構變更日期 - 建議使用多層次選擇器備援(主選擇器 + 備用選擇器) ### 第 15 條:爬蟲錯誤處理 - **所有爬蟲函數必須包含完整的錯誤處理** - 必須處理的情況: 1. 網路連線失敗 2. 頁面載入超時 3. 元素找不到(選擇器失效) 4. 資料格式異常 5. 反爬蟲機制觸發 - 錯誤發生時: - 記錄詳細錯誤日誌(包含 URL、選擇器、錯誤訊息) - 發送通知給管理員 - 不中斷其他爬蟲任務 - 保存最後成功的資料作為備援 ### 第 16 條:爬蟲測試要求 - **修改爬蟲程式碼後必須執行完整測試** - 測試項目: 1. 單一商品資料爬取 2. 列表頁面分頁爬取 3. 多執行緒/並發爬取 4. 錯誤處理機制 5. 資料儲存完整性 - 測試環境應模擬生產環境(網路延遲、並發請求) - 使用測試資料集驗證爬取結果準確性 ### 第 17 條:爬蟲依賴管理 - **爬蟲依賴的套件版本必須固定** - `requirements.txt` 中爬蟲相關套件必須指定版本號: - `selenium==4.x.x` (具體版本) - `requests==2.x.x` - `beautifulsoup4==4.x.x` - 升級套件前必須: 1. 在測試環境驗證相容性 2. 檢查 changelog 確認無破壞性變更 3. 執行完整爬蟲測試套件 4. 記錄升級原因和影響 ### 第 18 條:網站結構變更應對 - **定期檢查目標網站結構是否變更** - 建立網站結構監控機制: 1. 記錄關鍵元素的 HTML 結構 2. 定期比對結構變化 3. 發現變更時立即通知 4. 建立選擇器失效告警 - 保存網站結構快照(HTML samples)供除錯使用 ### 第 19 條:爬蟲效能與禮節 - **遵守網站的 robots.txt 規範** - 設定合理的請求間隔(建議 1-3 秒) - 使用 User-Agent 識別身份 - 避免在網站高峰時段進行大量爬取 - 實作請求失敗的退避重試機制(Exponential Backoff) ### 第 20 條:資料驗證與清洗 - **爬取的資料必須經過驗證** - 驗證項目: 1. 價格範圍合理性(不可為 0 或異常大) 2. 日期格式正確性 3. 必填欄位完整性 4. 資料型別正確性 - 發現異常資料時: - 記錄到錯誤日誌 - 標記為「需人工審核」 - 不自動儲存到資料庫 - 發送通知給管理員 ### 第 21 條:爬蟲版本控制 - **爬蟲程式碼每次修改必須建立 Git commit** - Commit 訊息格式: - `[Crawler] [網站名稱] 修改描述` - 例:`[Crawler] [MOMO] 修復商品價格選擇器失效問題` - 重大修改應建立分支,測試通過後才合併 - 保留至少最近 3 個可運作版本的備份 ### 第 22 條:爬蟲文檔要求 - **每個爬蟲模組必須包含詳細文檔** - 必須記錄: 1. 爬取目標(網站 URL、資料類型) 2. 執行頻率(每小時/每日) 3. 關鍵選擇器說明 4. 已知問題和限制 5. 最後修改日期和原因 6. 聯絡人/負責人 - 文檔應隨程式碼更新 --- ## 🧪 第五章:測試與品質保證 ### 第 23 條:測試覆蓋 - 所有安全功能必須有對應的測試 - 測試必須包含正常情況和攻擊情境 - 使用 `test_*.py` 命名測試檔案 - 執行 `./run_security_tests.sh` 必須全部通過 ### 第 24 條:安全測試項目 必須測試以下項目: 1. 環境變數與憑證管理 2. SQL 注入防護 3. 路徑遍歷防護 4. 檔案上傳驗證 5. CSRF 防護 6. 登入驗證強化 7. Flask 安全配置 ### 第 25 條:爬蟲測試項目 必須測試以下項目: 1. 選擇器有效性測試 2. 資料完整性測試 3. 錯誤處理測試 4. 並發爬取測試 5. 效能壓力測試 ### 第 26 條:程式碼審查 - 所有涉及安全的程式碼變更必須經過審查 - 所有涉及爬蟲的程式碼變更必須經過審查 - 檢查是否符合本憲法規範 - 驗證是否通過完整測試 - 確認日誌和錯誤處理完整 --- ## 📦 第六章:部署與維運 ### 第 27 條:環境管理規範 #### 27.1 環境分層 本系統採用三層環境架構: 1. **開發環境 (Development)** - 位置:`/Users/ogt/momo_pro_system` (macOS Local) - 用途:程式碼開發、快速測試、UI/UX 調整 - 運行方式:直接執行 `python app.py` - 特性:即時修改、快速迭代 2. **測試環境 (Testing)** - 位置:同開發環境 - 用途:功能測試、安全測試、回歸測試 - 運行方式:執行測試腳本 3. **正式環境 (Production)** - 位置:`/home/ogt/momo_pro_system` (GCP VM) - 用途:生產服務、24/7 運行 - 運行方式:systemd service - 網址:`https://momo.wooo.work` #### 27.2 環境同步原則 **嚴格禁止**: - ❌ 直接在正式環境修改程式碼 - ❌ 跳過測試直接部署到正式環境 - ❌ 混用不同環境的資料庫 - ❌ 將 `.env` 檔案上傳到 Git **必須遵守**: - ✅ 所有修改必須在開發環境完成 - ✅ 完整測試通過後才能部署 - ✅ 部署前必須備份正式環境 - ✅ 部署後必須驗證功能正常 - ✅ 監控 24 小時確保穩定 #### 27.3 標準部署流程 參照 `DEPLOYMENT_WORKFLOW.md` 文檔,嚴格遵守以下流程: ``` 開發 → 測試 → 備份 → 部署 → 驗證 → 監控 ``` **階段性檢查**: 1. **開發階段**:程式碼符合規範、Git commit 完成 2. **測試階段**:功能測試、安全測試、爬蟲測試通過 3. **部署前**:備份正式環境、確認修改檔案清單 4. **部署中**:使用標準部署腳本或手動部署 5. **部署後**:服務狀態正常、功能驗證通過 6. **監控期**:持續監控 24 小時 #### 27.4 部署方法選擇 **方法 A:完整部署**(推薦用於大改動) ```bash cd /Users/ogt/momo_pro_system ./deploy_scripts/deploy_to_gcp.sh ``` 適用於: - Python 程式碼修改 - 依賴套件更新 - 配置檔案變更 - 資料庫結構變更 **方法 B:快速更新**(用於小改動) ```bash gcloud compute scp --zone=asia-east1-a 修改的檔案 momo-server:~/momo_pro_system/ ``` 適用於: - HTML/CSS/JS 檔案修改 - 模板檔案更新 - 靜態資源更新 **重要**: - HTML/CSS/JS 修改:不需重啟服務(Flask 自動重載模板) - Python 檔案修改:必須重啟服務 - 配置檔案修改:必須重啟服務 ### 第 28 條:變更前強制備份原則 ⚠️ **重要性:最高優先級** **核心原則**: - **所有涉及嚴重影響的變更、修改操作,變更前必須先進行完整備份** - **備份完成並確認無誤後,才可進行變更** - 違反此原則的變更操作視為嚴重違規 **適用範圍**: 以下操作在執行前必須完整備份: 1. **資料庫相關** - 資料庫結構變更(ALTER TABLE, DROP, CREATE) - 大量資料修改或刪除(UPDATE, DELETE 影響 >100 筆) - 資料庫升級或遷移 - 索引重建或優化 2. **系統配置** - 系統配置檔案修改(config.py, .env) - Nginx/Apache 配置變更 - Systemd service 配置修改 - 排程任務(crontab, scheduler)變更 3. **核心程式碼** - 爬蟲核心邏輯修改 - 資料庫連線和 ORM 修改 - 認證和安全模組修改 - API 端點的破壞性變更 4. **部署操作** - 生產環境程式碼更新 - Python 依賴套件升級 - 系統套件升級(Python, Node.js 等) - 伺服器遷移或重啟 5. **資料處理** - Excel 匯入覆蓋現有資料 - 批次資料清理或轉換 - 歷史資料歸檔或刪除 **備份要求**: **必須備份的內容**: - 完整資料庫檔案(momo.db 或 PostgreSQL dump) - 所有程式碼檔案(Git commit + 檔案副本) - 配置檔案(config.py, .env, nginx.conf 等) - 重要的資料檔案(Excel, CSV 等) **備份驗證**: - 檢查備份檔案完整性(檔案大小、MD5 校驗) - 確認備份可讀取(嘗試開啟資料庫) - 記錄備份時間和檔案位置 - 確保備份檔案有足夠的磁碟空間 **備份命名規範**: ``` 資料庫:momo_backup_YYYYMMDD_HHMMSS.db 程式碼:momo_code_backup_YYYYMMDD_HHMMSS.tar.gz 配置:config_backup_YYYYMMDD_HHMMSS.tar.gz ``` **復原計畫**: - 每次重大變更必須準備復原步驟文件 - 測試復原流程的可行性 - 記錄復原所需時間 - 確保有回滾機制 **違規處理**: - 未備份就執行重大變更:視為一級違規 - 備份不完整或無法復原:視為二級違規 - 必須立即停止變更,進行損害評估 - 記錄事件並更新操作規範 **例外情況**: 僅以下情況可豁免備份要求: - 純前端 HTML/CSS/JS 修改(不影響資料) - 日誌檔案查看(唯讀操作) - 系統監控和狀態查詢 - 測試環境的實驗性變更 ### 第 29 條:環境配置 - 開發環境使用 `.env` - 生產環境使用環境變數注入 - 不同環境使用不同的 `SECRET_KEY` - 定期輪換敏感憑證 ### 第 30 條:備份策略 - 資料庫每日自動備份 - 備份檔案加密保存 - 保留最近 7 天備份 - 使用 `safe_join()` 處理備份路徑 ### 第 31 條:更新流程 1. **評估變更影響**(是否需要備份,參照第 28 條) 2. **完整備份**(若屬於重大變更,必須先備份) 3. 更新程式碼 4. 執行完整測試套件(安全測試 + 爬蟲測試) 5. 檢查安全日誌 6. 重啟服務 7. 驗證功能正常(包含爬蟲任務) 8. 監控 24 小時確保穩定 9. 確認備份可刪除或歸檔 --- ## 🚨 第七章:事件處理 ### 第 32 條:安全事件 發現安全漏洞時: 1. 立即記錄詳細資訊 2. 評估風險等級(Critical/High/Medium/Low) 3. 優先處理 Critical 和 High 級別 4. 修復後執行完整測試 5. 更新 `SECURITY_FIX_SUMMARY.md` ### 第 33 條:爬蟲異常事件 發現爬蟲異常時: 1. 記錄詳細錯誤資訊(URL、選擇器、錯誤訊息) 2. 檢查是否為網站結構變更 3. 若為選擇器失效,立即修復並測試 4. 發送通知給管理員 5. 記錄在爬蟲維護日誌中 ### 第 34 條:錯誤處理 - 所有錯誤必須妥善處理,不得暴露敏感資訊 - 使用者看到的錯誤訊息應簡潔明確 - 詳細錯誤資訊記錄在日誌中 - 開發環境可顯示詳細錯誤,生產環境僅顯示通用訊息 --- ## 🔧 第八章:開發工具與依賴 ### 第 35 條:Python 依賴 核心依賴套件(見 `requirements.txt`): - Flask (Web 框架) - Flask-WTF (CSRF 防護) - SQLAlchemy (ORM) - pandas (資料處理) - selenium (網頁自動化) - werkzeug (安全工具) ### 第 36 條:版本控制 - 使用 Git 進行版本控制 - Commit 訊息使用繁體中文 - Commit 格式:`[模組] 簡短描述` - 例:`[Security] 修復路徑遍歷漏洞` - 例:`[Crawler] [MOMO] 更新商品價格選擇器` ### 第 37 條:開發環境 - Python 3.8+ - 使用虛擬環境 (venv) - IDE 建議:VSCode, PyCharm - 測試環境與生產環境分離 - 爬蟲測試使用獨立環境 --- ## 📊 第九章:監控與維護 ### 第 38 條:系統監控 - 定期檢查安全日誌 - 監控登入失敗次數 - 追蹤異常 API 請求 - 定期執行安全測試 ### 第 39 條:爬蟲監控 - 監控爬蟲執行成功率 - 追蹤選擇器失效次數 - 檢查資料品質(異常值、缺失值) - 監控爬取耗時變化 - 定期檢查目標網站結構 ### 第 40 條:效能監控 - 資料庫查詢效能 - API 回應時間 - 記憶體使用量 - 磁碟空間 - 爬蟲執行效率 --- ## 📋 第十章:憲法修訂 ### 第 41 條:修訂流程 - 本憲法可隨專案需求修訂 - 修訂需說明原因和影響範圍 - 更新版本號和修訂日期 - 記錄在文檔歷史中 ### 第 42 條:解釋權 - 本憲法條款如有疑義,以最新版本為準 - 技術決策以穩定性和安全性優先 - 爬蟲修改以不影響現有功能為原則 - 使用者體驗和效能次之 --- ## 📚 附錄:快速檢查清單 ### ✅ 新功能開發檢查 - [ ] 程式碼和註解使用繁體中文 - [ ] 無硬編碼敏感資訊 - [ ] 所有輸入經過驗證 - [ ] POST 請求包含 CSRF token - [ ] 路徑操作使用 `safe_join()` - [ ] 檔案上傳經過驗證 - [ ] 錯誤處理完整 - [ ] 日誌記錄完整 - [ ] 通過安全測試 - [ ] 更新相關文檔 ### ⚠️ 重大變更前備份檢查 - [ ] 評估變更影響範圍(資料庫/配置/核心程式碼/部署) - [ ] 確認符合第 28 條適用範圍 - [ ] 完整備份資料庫檔案 - [ ] 備份所有程式碼(Git commit + 檔案副本) - [ ] 備份配置檔案 - [ ] 驗證備份檔案完整性(檔案大小、可讀取) - [ ] 記錄備份時間和位置 - [ ] 準備復原計畫文件 - [ ] 測試復原流程可行性 - [ ] 確保有回滾機制 ### 🔒 安全審查檢查 - [ ] SQL 查詢使用參數化或白名單 - [ ] 無明文密碼 - [ ] Session 配置正確 - [ ] CSRF 防護啟用 - [ ] 路徑遍歷防護 - [ ] 檔案上傳限制 - [ ] 登入失敗鎖定 - [ ] 敏感操作有日誌 ### 🕷️ 爬蟲修改檢查 - [ ] 備份現有可運作版本 - [ ] 記錄修改原因和網站變更資訊 - [ ] 保留舊選擇器作為註解 - [ ] 測試新選擇器正確性 - [ ] 執行單一商品爬取測試 - [ ] 執行列表頁面爬取測試 - [ ] 驗證資料完整性和格式 - [ ] 檢查錯誤處理機制 - [ ] 更新爬蟲文檔 - [ ] 記錄在維護日誌中 - [ ] 建立 Git commit - [ ] 監控 24 小時確保穩定 --- ## 🎯 結語 本憲法旨在確保 MOMO 監控系統的安全性、穩定性、可維護性和一致性。所有參與者應: 1. **遵守規範**:嚴格遵守本憲法所有條款 2. **持續改進**:隨著專案發展適時修訂 3. **穩定優先**:爬蟲修改以不影響現有功能為原則 4. **安全第一**:任何決策以安全為最高優先 5. **謹慎測試**:修改後必須完整測試並監控 6. **文檔完整**:保持文檔與程式碼同步更新 **核心原則:** - **安全不是功能,而是基礎** - **爬蟲是核心業務,修改需格外謹慎** - **測試是品質的保證,不可省略** --- **版本歷史:** - v1.3 (2026-01-14): 新增第六章第 28 條「變更前強制備份原則」⚠️,明確規定所有涉及嚴重影響的變更操作前必須完整備份,定義適用範圍、備份要求、驗證流程、復原計畫及違規處理機制 - v1.2 (2026-01-13): 擴充第六章第 27 條「環境管理規範」,明確定義開發/測試/正式三層環境架構、環境同步原則、標準部署流程,並新增 `DEPLOYMENT_WORKFLOW.md` 完整部署文檔 - v1.1 (2026-01-12): 新增第四章「數據爬取規範」(第 13-22 條),定義爬蟲程式碼穩定性、選擇器維護、錯誤處理、測試要求等 10 項規範 - v1.0 (2026-01-12): 初版發布,定義核心規範