2024-11-28|閱讀時間 ‧ 約 7 分鐘

駭客概念:SQL Injection | 資料庫分區(Partitioning) 和 分片(Sharding)

本篇為參考各路大神資料的學習筆記,若有錯誤請不吝指正。

以下比喻參考自網站安全🔒 一次看懂 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'='1password = ''
  • 組合後的 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,分片後:

  1. 伺服器 A 存放 ID 1~10,000 的用戶。
  2. 伺服器 B 存放 ID 10,001~20,000 的用戶。

總結

  1. 垂直分區(Vertical Partitioning):
    • 按欄位拆分表,適合優化查詢結構。
  2. 水平分區(Horizontal Partitioning):
    • 按行拆分表,適合減少單表數據量,提高性能。
  3. 分片(Sharding):
    • 資料跨伺服器分布,適合處理大數據。

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.