文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  LOAD DATA LOCAL 的安全性考量

8.1.6 LOAD DATA LOCAL 的安全性考量

LOAD DATA 陳述式會將資料檔案載入表格中。此陳述式可以載入位於伺服器主機上的檔案,或者,如果指定了 LOCAL 關鍵字,則可以載入位於用戶端主機上的檔案。

LOAD DATALOCAL 版本有兩個潛在的安全性問題

  • 由於 LOAD DATA LOCAL 是一個 SQL 陳述式,因此剖析會在伺服器端發生,並且檔案從用戶端主機傳輸到伺服器主機是由 MySQL 伺服器啟動,MySQL 伺服器會告知用戶端陳述式中命名的檔案。理論上,修補過的伺服器可能會告知用戶端程式傳輸伺服器選擇的檔案,而不是陳述式中命名的檔案。這類伺服器可以存取用戶端使用者具有讀取權限的用戶端主機上的任何檔案。(實際上,修補過的伺服器可以對任何陳述式(而不僅是 LOAD DATA LOCAL)回應檔案傳輸請求,因此更根本的問題是用戶端不應該連線到不受信任的伺服器。)

  • 在用戶端從 Web 伺服器連線的 Web 環境中,使用者可以使用 LOAD DATA LOCAL 來讀取 Web 伺服器程序具有讀取權限的任何檔案(假設使用者可以對 SQL 伺服器執行任何陳述式)。在此環境中,相對於 MySQL 伺服器的用戶端實際上是 Web 伺服器,而不是由連線到 Web 伺服器的使用者執行的遠端程式。

為了避免連線到不受信任的伺服器,客戶端可以建立安全連線並使用 --ssl-mode=VERIFY_IDENTITY 選項和適當的 CA 憑證來驗證伺服器身分。要實作此層級的驗證,您必須先確保伺服器的 CA 憑證對副本是可靠可用的,否則會導致可用性問題。如需更多資訊,請參閱加密連線的命令選項

為了避免 LOAD DATA 問題,除非已採取適當的客戶端預防措施,否則客戶端應避免使用 LOCAL

為了控制本機資料載入,MySQL 允許啟用或停用此功能。MySQL 也允許客戶端將本機資料載入操作限制在指定目錄中的檔案。

啟用或停用本機資料載入功能

管理員和應用程式可以設定是否允許本機資料載入,如下所示

  • 在伺服器端

    • local_infile 系統變數控制伺服器端的 LOCAL 功能。根據 local_infile 設定,伺服器會拒絕或允許請求本機資料載入的客戶端進行本機資料載入。

    • 預設情況下,local_infile 已停用。(這是與先前 MySQL 版本不同的地方。) 若要使伺服器明確拒絕或允許 LOAD DATA LOCAL 陳述式 (無論客戶端程式和程式庫在建置時或執行時如何設定),請啟動 mysqld 並停用或啟用 local_infilelocal_infile 也可以在執行時設定。

  • 在客戶端

    • ENABLED_LOCAL_INFILE CMake 選項控制 MySQL 客戶端程式庫的編譯預設 LOCAL 功能 (請參閱 第 2.8.7 節,「MySQL 來源設定選項」)。因此,未進行明確安排的客戶端會根據 MySQL 建置時指定的 ENABLED_LOCAL_INFILE 設定來停用或啟用 LOCAL 功能。

    • 預設情況下,MySQL 二進位發行版本中的客戶端程式庫在編譯時會停用 ENABLED_LOCAL_INFILE。如果您從來源編譯 MySQL,請根據未進行明確安排的客戶端是否應停用或啟用 LOCAL 功能,使用停用或啟用 ENABLED_LOCAL_INFILE 來設定它。

    • 對於使用 C API 的客戶端程式,本機資料載入功能由編譯到 MySQL 客戶端程式庫的預設值決定。若要明確啟用或停用它,請呼叫 mysql_options() C API 函式以停用或啟用 MYSQL_OPT_LOCAL_INFILE 選項。請參閱 mysql_options()

    • 對於 mysql 客戶端,本機資料載入功能由編譯到 MySQL 客戶端程式庫的預設值決定。若要明確停用或啟用它,請使用 --local-infile=0--local-infile[=1] 選項。

    • 對於 mysqlimport 客戶端,預設不會使用本機資料載入。若要明確停用或啟用它,請使用 --local=0--local[=1] 選項。

    • 如果您在 Perl 指令碼或其他從選項檔案讀取 [client] 群組的程式中使用 LOAD DATA LOCAL,您可以將 local-infile 選項設定新增至該群組。為了防止不瞭解此選項的程式發生問題,請使用 loose- 前置詞來指定它

      [client]
      loose-local-infile=0

      [client]
      loose-local-infile=1
    • 在所有情況下,客戶端成功使用 LOCAL 載入操作也需要伺服器允許本機載入。

如果伺服器或客戶端停用 LOCAL 功能,嘗試發出 LOAD DATA LOCAL 陳述式的客戶端會收到以下錯誤訊息

ERROR 3950 (42000): Loading local data is disabled; this must be
enabled on both the client and server side

限制允許本機資料載入的檔案

MySQL 客戶端程式庫允許客戶端應用程式將本機資料載入操作限制在指定目錄中的檔案。某些 MySQL 客戶端程式會利用此功能。

使用 C API 的客戶端程式可以使用 mysql_options() C API 函式的 MYSQL_OPT_LOCAL_INFILEMYSQL_OPT_LOAD_DATA_LOCAL_DIR 選項來控制允許哪些檔案進行資料載入 (請參閱 mysql_options())。

MYSQL_OPT_LOAD_DATA_LOCAL_DIR 的效果取決於是否啟用或停用 LOCAL 資料載入

  • 如果啟用 LOCAL 資料載入 (預設在 MySQL 客戶端程式庫中,或明確啟用 MYSQL_OPT_LOCAL_INFILE),則 MYSQL_OPT_LOAD_DATA_LOCAL_DIR 選項無效。

  • 如果停用 LOCAL 資料載入 (預設在 MySQL 客戶端程式庫中,或明確停用 MYSQL_OPT_LOCAL_INFILE),則可以使用 MYSQL_OPT_LOAD_DATA_LOCAL_DIR 選項來指定允許本機載入檔案的目錄。在此情況下,允許 LOCAL 資料載入,但僅限於指定目錄中的檔案。對 MYSQL_OPT_LOAD_DATA_LOCAL_DIR 值的解譯如下

    • 如果值為 Null 指標 (預設值),則它不指定任何目錄,因此不允許任何檔案進行 LOCAL 資料載入。

    • 如果值為目錄路徑名稱,則允許 LOCAL 資料載入,但僅限於位於指定目錄中的檔案。無論基礎檔案系統是否區分大小寫,目錄路徑名稱與要載入的檔案的路徑名稱的比較都會區分大小寫。

MySQL 客戶端程式會使用上述 mysql_options() 選項,如下所示

  • mysql 客戶端有一個 --load-data-local-dir 選項,它會採用目錄路徑或空字串。mysql 使用選項值來設定 MYSQL_OPT_LOAD_DATA_LOCAL_DIR 選項 (使用空字串將值設定為 Null 指標)。--load-data-local-dir 的效果取決於是否啟用 LOCAL 資料載入

    當套用 --load-data-local-dir 時,選項值會指定本機資料檔案必須所在的目錄。無論基礎檔案系統是否區分大小寫,目錄路徑名稱與要載入的檔案的路徑名稱的比較都會區分大小寫。如果選項值為空字串,則它不指定任何目錄,因此不允許任何檔案進行本機資料載入。

  • mysqlimport 會為其處理的每個檔案設定 MYSQL_OPT_LOAD_DATA_LOCAL_DIR,以便包含該檔案的目錄是允許的本機載入目錄。

  • 對於對應於 LOAD DATA 陳述式的資料載入操作,mysqlbinlog 會從二進位日誌事件中提取檔案,將它們作為暫存檔寫入本機檔案系統,並寫入 LOAD DATA LOCAL 陳述式以導致檔案被載入。依預設,mysqlbinlog 會將這些暫存檔寫入特定於作業系統的目錄。可以使用 --local-load 選項來明確指定 mysqlbinlog 應準備本機暫存檔的目錄。

    因為其他處理程序可能會將檔案寫入預設的系統特定目錄,因此建議指定 --local-load 選項給 mysqlbinlog,以指定資料檔案的不同目錄,然後透過指定 --load-data-local-dir 選項給 mysql,在處理 mysqlbinlog 的輸出時指定相同的目錄。

MySQL Shell 和本機資料載入

MySQL Shell 提供了許多公用程式來傾印資料表、結構描述或伺服器執行個體,並將它們載入到其他執行個體中。當您使用這些公用程式來處理資料時,MySQL Shell 會提供其他功能,例如輸入預處理、多執行緒平行載入、檔案壓縮和解壓縮,以及處理對 Oracle Cloud Infrastructure Object Storage 儲存貯體的存取。為了獲得最佳功能,請務必使用最新版本的 MySQL Shell 的傾印和傾印載入公用程式。

MySQL Shell 的資料上傳公用程式使用 LOAD DATA LOCAL INFILE 陳述式來上傳資料,因此目標伺服器執行個體上的 local_infile 系統變數必須設定為 ON。您可以在上傳資料之前執行此操作,然後再次移除它。這些公用程式會安全地處理檔案傳輸要求,以處理本主題中討論的安全性考量。

MySQL Shell 包括這些傾印和傾印載入公用程式

資料表匯出公用程式 util.exportTable()

將 MySQL 關係資料表匯出到資料檔案中,可以使用 MySQL Shell 的平行資料表匯入公用程式將該檔案上傳到 MySQL 伺服器執行個體、匯入到其他應用程式或用作邏輯備份。該公用程式具有預設選項和自訂選項,以產生不同的輸出格式。

平行資料表匯入公用程式 util.importTable()

將資料檔案匯入到 MySQL 關係資料表。資料檔案可以是 MySQL Shell 的資料表匯出公用程式的輸出,或是該公用程式的預設和自訂選項所支援的其他格式。該公用程式可以在將資料新增至資料表之前執行輸入預處理。它可以接受多個資料檔案合併到單一關係資料表中,並自動解壓縮壓縮檔案。

執行個體傾印公用程式 util.dumpInstance()、結構描述傾印公用程式 util.dumpSchemas() 和資料表傾印公用程式 util.dumpTables()

將執行個體、結構描述或資料表匯出到一組傾印檔案,然後可以使用 MySQL Shell 的傾印載入公用程式將這些檔案上傳到 MySQL 執行個體。這些公用程式提供 Oracle Cloud Infrastructure Object Storage 串流、HeatWave 服務相容性檢查和修改,以及執行試執行以識別問題的能力,然後再繼續進行傾印。

傾印載入公用程式 util.loadDump()

將使用 MySQL Shell 的執行個體、結構描述或資料表傾印公用程式建立的傾印檔案匯入到 HeatWave 服務資料庫系統或 MySQL 伺服器執行個體。該公用程式管理上傳程序,並提供來自遠端儲存空間的資料串流、平行載入資料表或資料表區塊、進度狀態追蹤、恢復和重設功能,以及在傾印仍在進行時同時載入的選項。MySQL Shell 的平行資料表匯入公用程式可以與傾印載入公用程式結合使用,以在將資料上傳到目標 MySQL 執行個體之前修改資料。

如需公用程式的詳細資訊,請參閱MySQL Shell 公用程式