本篇為參考各路大神資料的學習筆記,若有錯誤請不吝指正。
以下比喻參考自網站安全🔒 一次看懂 SQL Injection 的攻擊原理 — 「雍正繼位之謎」
SQL Injection(SQL 注入)是一種常見的駭客攻擊技術,目的是透過竄改應用程式發出的 SQL 語法,非法存取或操控資料庫。用傳說中雍正改「傳位十四子」為「傳位于四子」的例子來比喻,非常貼切:駭客利用程式的弱點,插入額外的指令,改變原本的意圖。
以下是對 SQL Injection 的完整解釋及舉例:
假設有一個登入系統,透過 SQL 查詢驗證用戶名和密碼:
SELECT * FROM users WHERE username = 'input_username' AND password = 'input_password';
username = Alice
, password = 1234
SELECT * FROM users WHERE username = 'Alice' AND password = '1234';
'' OR '1'='1'
。因為 OR 是 SQL的語法之一,所以SQL 就會把 輸入的 OR 視為語法之一。 username = ' OR '1'='1
,password = ''
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '';
'' OR '1'='1'
代表 OR 兩邊只有有一邊符合情況,登入系統 '1'='1' 是一個永遠為真的條件,這使得 SQL 查詢無視密碼驗證,返回整個 users 表的內容,駭客成功繞過驗證。目標: 查詢整個 users
表的所有內容。
username = ' OR 1=1; --
,password = ''
SELECT * FROM users WHERE username = '' OR 1=1; -- AND password = '';
防止 SQL Injection 的核心是確保所有使用者輸入都被正確處理,防止惡意語句影響原本的 SQL 查詢。
cursor.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, password))
** 此項為 ChatGPT 回復,待查資料
user = User.objects.filter(username="Alice", password="1234").first()
用「雍正改傳位」的例子來說,防止 SQL Injection 就是要確保:
資料庫分區(Partitioning) 和 分片(Sharding) 是常用的技術,讓資料庫更好管理,其中 Partitioning 又細分成垂直分區(Vertical Partitioning)和水平分區(Horizontal Partitioning)。透過這些做法將一個資料表分成多個部分。
定義:
資料分片是將資料表的資料分散到不同的伺服器上,每個伺服器存放不同的分片。這是一種資料庫水平分區的擴展形式,用於處理超大規模資料。
特點:不同於分區,分片是跨多個伺服器進行的,而分區通常在同一伺服器內。
優點:
缺點:資料一致性和跨分片查詢的難度較高,如果要更新資料要跨伺服器更新。
比喻:
範例:
假設有一個用戶表 Users,分片後: