嚴禁使用 root 啟動 MySQL 服務。 MySQL 3.23.15+ 預設禁止 root 啟動,若強制需加 --user=root。Root 啟動會導致 LOAD DATA INFILE、SELECT ... INTO OUTFILE 擁有系統寫入權限,極度危險。
mysql 系統用戶啟動:./safe_mysqld --user=mysql &LOAD DATA INFILE 僅能讀全域可讀檔案;INTO OUTFILE 不覆蓋既有檔案。命令列帶密碼會寫入 ~/.bash_history:
# 危險寫法
mysqldump -uroot -ptest test > test.sql
mysql -uroot -ptest
互動模式下的 SQL 指令會寫入 ~/.mysql_history,包含 SET PASSWORD 等敏感操作。
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)。永遠不信任使用者輸入!
# 錯誤:數值未加引號,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 API | mysql_real_escape_string() |
| MySQL++ | escape() + quote() |
| Perl DBI | $dbh->quote() / Placeholders |
| Java JDBC | PreparedStatement 物件 |
%22 (")、%23 (#)、%27 (') 等編碼攻擊。