首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 資料庫安全配置與程式開發防禦實務

     編輯:MySQL 資料庫相關知識

服務啟動安全性

嚴禁使用 root 啟動 MySQL 服務。 MySQL 3.23.15+ 預設禁止 root 啟動,若強制需加 --user=root。Root 啟動會導致 LOAD DATA INFILE、SELECT ... INTO OUTFILE 擁有系統寫入權限,極度危險。

  • 建立專用 mysql 系統用戶啟動:./safe_mysqld --user=mysql &
  • MySQL 內建限制:LOAD DATA INFILE 僅能讀全域可讀檔案;INTO OUTFILE 不覆蓋既有檔案。

本地日誌洩漏風險防範

Shell 歷史紀錄

命令列帶密碼會寫入 ~/.bash_history:

# 危險寫法
mysqldump -uroot -ptest test > test.sql
mysql -uroot -ptest

MySQL 客戶端歷史紀錄

互動模式下的 SQL 指令會寫入 ~/.mysql_history,包含 SET PASSWORD 等敏感操作。

解決方案:導向 /dev/null

rm -f ~/.bash_history ~/.mysql_history
ln -s /dev/null ~/.bash_history
ln -s /dev/null ~/.mysql_history

或在 .bashrc 設定 HISTCONTROL=ignorespace,命令前加空格不記錄。

正確操作習慣

  • 密碼參數 -p 後不帶密碼,待提示再輸入。
  • 腳本中使用 --defaults-extra-file 指定密碼檔 (權限 600)。

程式開發防 SQL Injection 核心原則

永遠不信任使用者輸入!

數值欄位防禦

# 錯誤:數值未加引號,MySQL 會自動轉型並截取非數字字元
SELECT * FROM table WHERE id = 234

# 正確:加上引號,配合逸出函數
SELECT * FROM table WHERE id = '234'

各語言防注入對照表

語言/架構防禦函數/機制
PHP (mysql 擴展)mysql_real_escape_string() (PHP 4.3.0+)
PHP (mysqli)$stmt->bind_param() / Prepared Statements
PHP (PDO)$stmt->bindValue() / Prepared Statements
MySQL C APImysql_real_escape_string()
MySQL++escape() + quote()
Perl DBI$dbh->quote() / Placeholders
Java JDBCPreparedStatement 物件

Web 應用通用檢查清單

  1. 表單輸入單/雙引號測試錯誤處理。
  2. URL 參數檢查 %22 (")、%23 (#)、%27 (') 等編碼攻擊。
  3. 數值型參數嚴格驗證型別與範圍。
  4. 檢查輸入長度不超過欄位定義。
  5. 資料庫連線帳號遵循最小權限原則 (僅必要權限)。

參考資源

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