首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 生產環境安全配置與開發最佳實務

     編輯:MySQL 綜合教學

MySQL 安全強化:從安裝到開發的完整防護

資料庫安全是系統防護的核心層級。本文涵蓋服務啟動帳號、日誌洩漏防範、程式碼注入防禦、啟動參數強化五大面向,提供可直接套用的配置清單。

一、服務啟動帳號:拒絕 Root 權限運行

  • MySQL 3.23.15+ 預設以 mysql 專用帳號啟動,禁止 root。
  • 若必須用 root,需加 --user=root 參數 (極不建議)。
  • 風險: LOAD DATA INFILE、SELECT ... INTO OUTFILE 會以服務帳號權限讀寫檔案,root 啟動等同開放系統完整控制權。
  • MySQL 內建限制:LOAD DATA 僅能讀全域可讀檔案,INTO OUTFILE 不覆蓋既有檔案,但仍不足以防禦所有攻擊。

二、日誌檔案洩漏防範

Shell 歷史檔風險

# 危險:密碼明文寫入 .bash_history
mysqldump -u root -ptest db > backup.sql

MySQL 命令列歷史風險

# 危險:ALTER USER 指令含新密碼寫入 .mysql_history

防護措施

  1. 互動式輸入密碼:mysql -u root -p (不帶密碼參數)
  2. 腳本使用 --defaults-extra-file 讀取權限 600 的設定檔
  3. 定期清理或禁用歷史檔:
    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 注入
  • 所有輸入經驗證:長度、型別、格式、白名單字元
  • 最小權限原則:應用程式帳號僅授予必要 CRUD 權限,無 DDL/ADMIN 權限

各語言參數化查詢對照

語言/架構防注入關鍵 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生產環境關閉

五、緊急重設 Root 密碼流程

  1. kill $(cat /var/run/mysqld/mysqld.pid) 停止服務
  2. mysqld_safe --skip-grant-tables & 跳過權限啟動
  3. mysql -u root 免密登入
  4. FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼';
  5. 正常重啟服務

安全是持續過程,非一次性設定。建議納入 CI/CD 流程自動檢查配置基準,定期滲透測試與權限審計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved