SQL 注入是 Web 應用程式中最常見也最危險的安全漏洞之一。攻擊者透過在輸入欄位植入惡意 SQL 片段,竊取、篡改甚至刪除資料庫資料。本文整理常見的 SQL 注入攻擊手法,並說明對應的防禦策略,協助開發者建立安全的 PHP+MySQL 應用程式。
攻擊者常使用 ORDER BY 子句逐步增加數字,直到頁面報錯,以此判斷查詢結果的欄位數。另一種手法是利用 UNION SELECT 配合遞增數字,觀察哪個位置會回顯在頁面上,確認可利用的欄位位置。
MySQL 內建函數如 version()、database()、user() 等,若被注入到查詢中,會直接洩露資料庫版本、當前資料庫名稱及連線使用者帳號。此外,查詢 @@global.version_compile_os 可取得作業系統資訊,而 ord(mid(user(),1,1)) 可推測是否為 root 權限。
MySQL 5.0 以上版本內建 information_schema 資料庫,儲存所有資料庫、資料表與欄位的中繼資料。攻擊者可透過 UNION SELECT 查詢 SCHEMATA、TABLES、COLUMNS 表,逐步列舉目標資料庫結構。
若資料庫帳號擁有 FILE 權限,攻擊者可使用 LOAD_FILE() 讀取伺服器上的敏感檔案(如 /etc/passwd、httpd.conf、php.ini 等),或利用 INTO OUTFILE 寫入惡意 PHP 腳本(Web Shell)獲取伺服器控制權。
當前後端編碼不一致導致 Illegal mix of collations 錯誤時,攻擊者可能使用 UNHEX(HEX(...)) 繞過限制,繼續執行注入。
FILE、SHUTDOWN 等高危權限。理解攻擊手法是為了更好地防禦。開發者應將安全意識貫穿於開發全生命週期,採用參數化查詢作為核心防線,輔以最小權限、錯誤處理等措施,構建強健的 PHP+MySQL 應用程式。