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

MySQL LOAD DATA LOCAL 安全風險與防護機制詳解

     編輯:MySQL 資料庫相關知識

兩大核心安全風險

1. 惡意伺服器竊取客戶端任意檔案

打過補丁的惡意 MySQL Server 可在 LOAD DATA LOCAL 過程中,要求客戶端傳輸伺服器指定的檔案(如 /etc/passwd),而非客戶端原本指定的檔案。客戶端若以高權限執行,洩露風險極大。

2. Web 環境下繞過權限讀取伺服器檔案

Web 應用連接資料庫時,實際客戶端是 Web Server 進程。若攻擊者能注入 SQL 執行 LOAD DATA LOCAL INFILE '/etc/passwd',即可讀取 Web Server 進程可讀的任意檔案。

MySQL 版本演進與防護機制

版本/階段預設行為控制手段
≤ 3.23.48無限制—
3.23.49 / 4.0.2+客戶端庫預設啟用 --enable-local-infile編譯時 --disable-local-infile 關閉
現代版本 (5.7/8.0)客戶端庫預設啟用多層開關控制(見下)

四層防護開關(由強到弱)

  1. Server 端全域禁用:啟動參數 --local-infile=0,所有 LOAD DATA LOCAL 直接報錯 ERROR 1148。
  2. Client 端啟用/禁用:
    • mysql --local-infile[=1] 啟用
    • mysql --local-infile=0 禁用
    • mysqlimport --local / -L 啟用
  3. C API 程式控制:mysql_options(mysql, MYSQL_OPT_LOCAL_INFILE, 0) 禁用。
  4. 選項檔群組:在 [client] 群組加 loose-local-infile=1(loose- 前綴防舊版報錯)。

錯誤碼與排查

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

出現此錯誤表示 Server 或 Client 端已禁用 LOCAL,需檢查上述四層開關。

生產環境建議配置

  • Server 啟動加 local_infile=OFF(MySQL 8.0 系統變數)。
  • 應用程式連接池初始化時呼叫 mysql_options(..., MYSQL_OPT_LOCAL_INFILE, 0)。
  • 若業務確需匯入本地檔案,改用 LOAD DATA INFILE(Server 端檔案)或應用層讀取後改用 INSERT 批次寫入。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved