本篇為參考各路大神資料的學習筆記,若有錯誤請不吝指正。
以下比喻參考自網站安全🔒 一次看懂 SQL Injection 的攻擊原理 — 「雍正繼位之謎」SQL Injection(SQL 注入)是一種常見的駭客攻擊技術,目的是透過竄改應用程式發出的 SQL 語法,非法存取或操控資料庫。用傳說中雍正改「傳位十四子」為「傳位于四子」的例子來比喻,非常貼切:駭客利用程式的弱點,插入額外的指令,改變原本的意圖。以下是對 SQL Injection 的完整解釋及舉例:
什麼是 SQL Injection?
- 概念:
- 駭客透過輸入惡意的 SQL 語法,插入應用程式與資料庫之間的 SQL 查詢,讓資料庫執行不應執行的指令。
- 工作原理:
- 應用程式接收使用者輸入,將其嵌入到 SQL 語句中,卻未對輸入進行嚴格檢查或轉義,導致惡意輸入成為 SQL 的一部分。
SQL Injection 的基本範例
原始情境:
假設有一個登入系統,透過 SQL 查詢驗證用戶名和密碼:
SELECT * FROM users WHERE username = 'input_username' AND password = 'input_password';
正常輸入:
- 用戶輸入:
username = Alice
,password = 1234
- 組合後的 SQL 查詢:
SELECT * FROM users WHERE username = 'Alice' AND password = '1234';
惡意輸入(SQL Injection):
- 駭客在登入介面的 username 輸入
'' OR '1'='1'
。因為 OR 是 SQL的語法之一,所以SQL 就會把 輸入的 OR 視為語法之一。username = ' OR '1'='1
,password = ''
- 組合後的 SQL 查詢:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '';
- 解釋:
'' OR '1'='1'
代表 OR 兩邊只有有一邊符合情況,登入系統 '1'='1' 是一個永遠為真的條件,這使得 SQL 查詢無視密碼驗證,返回整個 users 表的內容,駭客成功繞過驗證。
- 解釋:
SQL Injection 的其他例子
竊取資料
目標: 查詢整個 users
表的所有內容。
- 駭客輸入:
username = ' OR 1=1; --
,password = ''
- 組合後的 SQL:
SELECT * FROM users WHERE username = '' OR 1=1; -- AND password = '';
- -- 是 SQL 中的註解符號,後面的部分會被忽略。
- 結果: 駭客獲得 users 表的全部資料。
如何防止 SQL Injection?
防止 SQL Injection 的核心是確保所有使用者輸入都被正確處理,防止惡意語句影響原本的 SQL 查詢。
1. 使用參數化查詢(Parameterized Query)
- 解法: 將 SQL 語句與使用者輸入分離,確保輸入只會被視為值,而非語法的一部分。
- 範例(以 Python 和 MySQL 為例):
cursor.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, password))
2. 使用 ORM(物件關聯映射)框架
** 此項為 ChatGPT 回復,待查資料
- 解法: 使用像 Django ORM、SQLAlchemy 等框架,它們會自動處理 SQL Injection 防護。
- 範例:
user = User.objects.filter(username="Alice", password="1234").first()
3. 輸入驗證
- 解法: 對使用者輸入進行格式檢查與過濾,確保不接受惡意內容。
- 限制輸入長度。
- 檢查是否符合預期格式(如僅接受字母、數字)。
4. 限制資料庫權限
- 解法: 確保應用程式使用的資料庫帳號僅具有最低權限,例如:
- 禁止應用程式帳號執行 DROP TABLE 或其他管理指令。
- 僅允許執行讀取和寫入操作。
總結
- SQL Injection 的本質: 透過插入惡意 SQL 指令,篡改資料庫操作。
- 危害: 可以竊取數據、繞過驗證、刪除資料,甚至控制伺服器。
- 防護方法: 使用參數化查詢、ORM 框架、輸入驗證,並限制資料庫權限。
用「雍正改傳位」的例子來說,防止 SQL Injection 就是要確保:
- 任何傳遞的「多餘筆畫」都無法改變原本的「傳位語句」。
- 透過嚴格的語法與格式檢查來保證內容的正確性。
資料庫分區(Partitioning) 和 分片(Sharding)
資料庫分區(Partitioning) 和 分片(Sharding) 是常用的技術,讓資料庫更好管理,其中 Partitioning 又細分成垂直分區(Vertical Partitioning)和水平分區(Horizontal Partitioning)。透過這些做法將一個資料表分成多個部分。

Sharding(資料分片)
定義:
資料分片是將資料表的資料分散到不同的伺服器上,每個伺服器存放不同的分片。這是一種資料庫水平分區的擴展形式,用於處理超大規模資料。
特點:不同於分區,分片是跨多個伺服器進行的,而分區通常在同一伺服器內。
優點:
- 無需擴充單個伺服器,直接新增伺服器即可擴展(橫向擴展)。
- 適合處理大量數據,像是社交媒體或電商網站,如果資料爆掉只要新增伺服器即可。
缺點:資料一致性和跨分片查詢的難度較高,如果要更新資料要跨伺服器更新。
比喻:
- 如果有一本超厚的百科全書,分區是將它分冊,而分片則是將不同的冊子分送到不同的圖書館。
範例:
假設有一個用戶表 Users,分片後:
- 伺服器 A 存放 ID 1~10,000 的用戶。
- 伺服器 B 存放 ID 10,001~20,000 的用戶。
總結
- 垂直分區(Vertical Partitioning):
- 按欄位拆分表,適合優化查詢結構。
- 水平分區(Horizontal Partitioning):
- 按行拆分表,適合減少單表數據量,提高性能。
- 分片(Sharding):
- 資料跨伺服器分布,適合處理大數據。