資料庫安全是系統防護的核心層級。本文涵蓋服務啟動帳號、日誌洩漏防範、程式碼注入防禦、啟動參數強化五大面向,提供可直接套用的配置清單。
mysql 專用帳號啟動,禁止 root。--user=root 參數 (極不建議)。LOAD DATA INFILE、SELECT ... INTO OUTFILE 會以服務帳號權限讀寫檔案,root 啟動等同開放系統完整控制權。LOAD DATA 僅能讀全域可讀檔案,INTO OUTFILE 不覆蓋既有檔案,但仍不足以防禦所有攻擊。# 危險:密碼明文寫入 .bash_history mysqldump -u root -ptest db > backup.sql
# 危險:ALTER USER 指令含新密碼寫入 .mysql_history
mysql -u root -p (不帶密碼參數)--defaults-extra-file 讀取權限 600 的設定檔rm ~/.bash_history ~/.mysql_history ln -s /dev/null ~/.bash_history ln -s /dev/null ~/.mysql_history
WHERE id='234' 而非 WHERE id=234,防止 234 OR 1=1 注入| 語言/架構 | 防注入關鍵 API |
|---|---|
| PHP (mysqli) | $stmt->bind_param(), mysqli_real_escape_string() |
| PHP (PDO) | $pdo->prepare(), execute([$params]) |
| Java (JDBC) | PreparedStatement, setString() 等 |
| Python (DB-API) | cursor.execute(sql, params) |
| C# (ADO.NET) | SqlCommand.Parameters.Add() |
| Perl (DBI) | $sth = $dbh->prepare(); $sth->execute(@params) |
| Go (database/sql) | db.QueryContext(ctx, sql, args...) |
| Node.js (mysql2) | connection.execute(sql, params) |
| 參數 | 功能 | 建議值 |
|---|---|---|
--skip-grant-tables | 跳過權限表 (緊急重設密碼專用) | 僅維護時臨時啟用 |
--skip-show-database | 隱藏 SHOW DATABASES (需 SHOW DATABASES 權限) | 生產環境啟用 |
--chroot=路徑 | 限制檔案讀寫於 chroot 目錄下 | /var/lib/mysql 或專用目錄 |
--log-slow-queries[=檔案] | 記錄超過 long_query_time 的查詢 | 啟用、分析慢查詢 |
--skip-networking | 關閉 TCP/IP,僅本機 Unix socket | 僅本機應用時啟用 |
--bind-address=127.0.0.1 | 僅綁定回環介面 (8.0+ 推薦寫法) | 生產環境啟用 |
local_infile=0 | 禁用 LOCAL INFILE | 生產環境關閉 |
kill $(cat /var/run/mysqld/mysqld.pid) 停止服務mysqld_safe --skip-grant-tables & 跳過權限啟動mysql -u root 免密登入FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼';安全是持續過程,非一次性設定。建議納入 CI/CD 流程自動檢查配置基準,定期滲透測試與權限審計。