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

MySQL LOAD DATA LOCAL 安全風險與防護:客戶端檔案竊取、Web 環境繞過與雙向禁用機制

     編輯:MySQL 資料庫相關知識

兩大攻擊面

防護演進歷程

  • 3.23.49 / 4.0.2 前:預設開啟,無防護。
  • 3.23.49+:客戶端庫編譯選項 --enable-local-infile 控制預設行為。
  • 現代版本:雙向顯式啟用機制。

四層防護矩陣

場景攻擊向量影響
惡意服務器服務器回應任意檔案名,誘導客戶端上傳 /etc/passwd、.ssh/id_rsa客戶端機器敏感檔案外洩
Web 應用注入攻擊者注入 LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE tWeb 伺服器進程可讀檔案被竊取並經資料庫外帶

原則:四層同時生效,任一層禁用即阻斷功能。

啟用例外場景 (若業務必須)

  1. 伺服器 my.cnf:local-infile=1
  2. 客戶端連線字串:?allowLocalInfile=true (Connector/J) / MYSQL_OPT_LOCAL_INFILE=1 (C API)
  3. 限制:僅允許受信任應用帳號、指定來源 IP、審計日誌記錄每次執行。

選項檔配置 (舊版客戶端相容)

[client]
loose-local-infile=1  # loose- 前綴避免舊版客戶端報錯

錯誤訊息識別

ERROR 1148 (42000): The used command is not allowed with this MySQL version

表示雙向任一端已禁用 LOCAL 功能。

結語

LOAD DATA LOCAL 是歷史兼容性遺留的高風險功能。現代最佳實踐:全面禁用 (編譯/運行/客戶端/應用四層),業務遷移至 LOAD DATA INFILE (伺服器端檔案、可控路徑) 或應用層流式寫入。若極少數場景必須保留,實施最小權限帳號、IP 白名單、全審計三重防護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
層級配置效果
伺服器編譯./configure --disable-local-infile徹底移除功能,無法運行期開啟
伺服器運行期--local-infile=0 (預設 8.0+)拒絕所有 LOAD DATA LOCAL 指令
客戶端程式mysql --local-infile=0 (預設)客戶端拒絕發送 LOCAL 指令
應用程式碼連線參數 MYSQL_OPT_LOCAL_INFILE=0連接器層面禁用