Yoru Karu Studio
程式設計學習筆記 | 生活心得程式設計學習筆記 | 生活心得
02-3. SQL Injection 防禦:Prepared Statements 與最佳實踐 ⏱️ 閱讀時間: 12 分鐘 🎯 難度: ⭐⭐ (中等) ⚠️ 重要: 本篇是 SQL Injection 系列最重要的一篇!
🎯 本篇重點 學習如何完全防禦 SQL Injection:Prepared Statements 原理、Django ORM 最佳實踐、輸入驗證、最小權限原則,以及完整的安全檢查清單。
🛡️ 防禦的核心原則 黃金法則 永遠不要將用戶輸入直接拼接到 SQL 查詢中!為什麼字串拼接危險? # ❌ 危險:字串拼接 username = "admin' OR '1'='1" query = f"SELECT * FROM users WHERE username = '{username}'" # 執行:SELECT * FROM users WHERE username = 'admin' OR '1'='1' # ↑ # 輸入改變了 SQL 結構 # ✅ 安全:參數化查詢 username = "admin' OR '1'='1" query = "SELECT * FROM users WHERE username = %s" cursor.
為什麼需要 Multi-step RAG? 想像你問:「Django 的創始人還創建了哪些其他框架?」
基礎 RAG 的困境:
步驟 1:檢索「Django 創始人」 找到:「Django 由 Adrian Holovaty 和 Simon Willison 創建」 步驟 2:生成答案 LLM:「我不知道 Adrian Holovaty 創建了哪些其他框架」 ❌ 失敗:需要再次檢索才能回答Multi-step RAG 的解決方案:
步驟 1:檢索「Django 創始人」 找到:Adrian Holovaty 步驟 2:再次檢索「Adrian Holovaty 創建的框架」 找到:Django、Soundslice 步驟 3:生成答案 LLM:「Adrian Holovaty 創建了 Django 和 Soundslice」 ✅ 成功:透過多次檢索完成推理本文將深入探討如何實作這種需要多步驟推理的 RAG 系統。
🎯 什麼是 M-hop 問題? M-hop(多跳)問題定義 M-hop 問題:需要透過 M 次「跳躍」(檢索)才能找到答案的問題。
1-hop 問題(簡單) 問題:「Django 是什麼?」 檢索 1 次: 「Django 是 Python 網頁框架」 → 直接找到答案 ✅2-hop 問題(中等) 問題:「Django 的創始人的出生地在哪裡?」 檢索 1:「Django 創始人是誰?」 答案 1:Adrian Holovaty 檢索 2:「Adrian Holovaty 的出生地?」 答案 2:美國伊利諾州 最終答案:美國伊利諾州 ✅3-hop 問題(困難) 問題:「Django 的創始人出生的州的首府是哪裡?」 檢索 1:「Django 創始人」 → Adrian Holovaty 檢索 2:「Adrian Holovaty 出生地」 → 美國伊利諾州 檢索 3:「伊利諾州的首府」 → Springfield 最終答案:Springfield ✅為什麼基礎 RAG 無法處理? # 基礎 RAG 的流程 def basic_rag(query): # 1.
02-2. SQL Injection 攻擊技巧:Union、Blind、Time-based ⏱️ 閱讀時間: 18 分鐘 🎯 難度: ⭐⭐⭐ (中高) ⚠️ 警告: 本文內容僅供學習與防禦用途,禁止用於非法攻擊
🎯 本篇重點 深入學習 4 種進階 SQL Injection 攻擊技巧:Union-based、Boolean-based Blind、Time-based Blind、Error-based,理解如何在不同限制下竊取資料。
📊 SQL Injection 攻擊分類 依回顯方式分類 1. In-band SQL Injection(帶內注入) ├─ Union-based(最常見) ├─ Error-based └─ 攻擊者可以直接看到查詢結果 2. Blind SQL Injection(盲注) ├─ Boolean-based(邏輯盲注) ├─ Time-based(時間盲注) └─ 攻擊者看不到查詢結果,需要推斷 3. Out-of-band SQL Injection(帶外注入) └─ 使用不同管道(如 DNS、HTTP)傳輸資料 └─ 較少見,需要特定資料庫功能難度對比 類型 難度 速度 適用場景 Union-based ⭐⭐ 快 查詢結果顯示在頁面上 Error-based ⭐⭐ 快 錯誤訊息顯示在頁面上 Boolean-based Blind ⭐⭐⭐ 慢 頁面有明顯差異(有無資料) Time-based Blind ⭐⭐⭐⭐ 很慢 頁面無差異,只能用時間判斷 1️⃣ Union-based SQL Injection 原理 使用 UNION 語句合併兩個查詢結果,在頁面上顯示額外資料
為什麼 Reranking 是 RAG 系統的關鍵? 想像你在圖書館找書,館員快速幫你找出 50 本相關的書,但順序是隨機的。你需要的那本可能排在第 37 位。
Reranking(重新排序) 就像一位細心的圖書館員,仔細檢查這 50 本書,把最相關的放在最前面。
本文將深入探討:
Pointwise vs Pairwise:兩種 Reranking 方法的對比 LLM Zero-shot Reranking:無需訓練的強大方案 如何用 Reranking 改進 Retriever 🎯 Reranking 在 RAG 中的角色 Two-Stage Retrieval(兩階段檢索) 階段 1:Fast Retrieval(粗排) 10,000 個文檔 → 向量搜尋 → Top 50 ⏱️ 速度:50ms 🎯 目標:快速縮小範圍 階段 2:Reranking(精排) Top 50 → 深度評分 → Top 5 ⏱️ 速度:200ms 🎯 目標:精確排序 結果: ✅ 總時間 250ms(可接受) ✅ 準確率大幅提升為什麼不直接用更好的模型檢索? # 問題:計算成本 # 方案 A:用強大模型直接檢索 10,000 個文檔 時間:10,000 × 20ms = 200 秒(太慢!) 成本:極高 # 方案 B:兩階段 階段 1:用快速模型檢索 → 50ms 階段 2:用強大模型 Rerank Top 50 → 200ms 總時間:250ms(可接受!) 成本:合理 結論:Reranking 是效率與效果的最佳平衡📊 Reranking 的兩大方法 1.
02-1. SQL Injection 基礎:什麼是 SQL 注入? ⏱️ 閱讀時間: 15 分鐘 🎯 難度: ⭐⭐ (中等) ⚠️ 警告: 本文內容僅供學習與防禦用途,禁止用於非法攻擊
🎯 本篇重點 理解 SQL Injection 的基本原理、危害程度、真實案例,以及最常見的攻擊手法。掌握如何識別漏洞代碼。
🤔 什麼是 SQL Injection? SQL Injection(SQL 注入) = 在應用程式的輸入中注入惡意 SQL 指令,控制資料庫
一句話解釋: SQL Injection 就像是在點餐單上偷偷加字,讓廚房執行你想要的「額外指令」,而不只是做一份餐。
技術定義 正常情況: 應用程式:「SELECT * FROM users WHERE username = 'john'」 資料庫:回傳 john 的資料 SQL Injection: 應用程式:「SELECT * FROM users WHERE username = 'john' OR '1'='1'」 ↑ 注入的惡意代碼 資料庫:回傳所有用戶的資料! 🍔 生活中的比喻 情境:餐廳點餐 正常點餐: 你:「我要一份牛肉麵」 廚房:(做一份牛肉麵) 結果:你得到一份牛肉麵 SQL Injection 攻擊: 你:「我要一份牛肉麵,還有把所有客人的訂單都給我」 廚房:(沒有檢查)執行了兩個指令 1.
為什麼需要 Advanced RAG? 想像你建立了一個基礎的 RAG 系統,但發現:
❌ 使用者問:「那個框架怎麼裝?」 → 系統不知道「那個」指什麼,檢索失敗
❌ 檢索到 50 個結果 → 但前 5 個都不太相關,真正的答案在第 23 個
❌ 上下文太長 → 5000 tokens 的文檔,但只有 200 tokens 真正有用
這就是為什麼我們需要 Advanced RAG!它能將基礎 RAG 的準確率從 70% 提升到 90%。
🎯 Advanced RAG 的兩大優化階段 Advanced RAG 在基礎 RAG 的流程中加入了**檢索前(Pre-retrieval)和檢索後(Post-retrieval)**的優化:
基礎 RAG 流程: 使用者問題 → 向量化 → 檢索 → 生成答案 Advanced RAG 流程: 使用者問題 ↓ 🔧 Pre-retrieval 優化(檢索前) ↓ 向量化 → 檢索 ↓ 🔧 Post-retrieval 優化(檢索後) ↓ 生成答案🔍 Pre-retrieval(檢索前優化) 1.