LOAD DATA語句可以裝載服務器主機上的文件,若指定LOCAL關鍵字,可以裝載客戶端文件。
支持LOCAL版本的LOAD DATA語句有兩個可能的安全問題:
· 由MySQL服務器啟動文件從客戶端向服務器主機的傳輸。理論上,打過補丁的服務器可以告訴客戶端程序傳輸服務器選擇的文件,而不是客戶用LOAD DATA語句指定的文件。這樣服務器可以訪問客戶端上客戶有讀訪問權限的任何文件。
· 在Web環境中,客戶從Web服務器連接,用戶可以使用LOAD DATA LOCAL來讀取Web服務器進程有讀訪問權限的任何文件(假定用戶可以運行SQL服務器的任何命令)。在這種環境中,MySQL服務器的客戶實際上是Web服務器,而不是連接Web服務器的用戶運行的程序。
要處理這些問題,我們更改了MySQL 3.23.49和MySQL 4.0.2(Windows中的4.0.13)中的LOAD DATA LOCAL的處理方法:
· 默認情況下,現在所有二進制分中的發MySQL客戶端和庫是用--enable-local-infile選項編譯,以便與MySQL 3.23.48和以前的版本兼容。
· 如果你從源碼構建MySQL但沒有使用--enable-local-infile選項來進行configure,則客戶不能使用LOAD DATA LOCAL,除非顯式調用mysql_options (...MYSQL_OPT_本地_INFILE,0)。參見25.2.3.48節,“MySQL_options()”。
· 你可以用--local-infile=0選項啟動MySQLd從服務器端禁用所有LOAD DATA LOCAL命令。
· 對於mysql命令行客戶端,可以通過指定--local-infile[=1]選項啟用LOAD DATA LOCAL,或通過--local-infile=0選項禁用。類似地,對於MySQLimport,--local or -L選項啟用本地數據文件裝載。在任何情況下,成功進行本地裝載需要服務器啟用相關選項。
· 如果你使用LOAD DATA LOCAL Perl腳本或其它讀選項文件中的[clIEnt]組的程序,你可以在組內添加local-infile=1選項。但是,為了便面不理解local-infile的程序產生問題,則規定使用loose- prefix:
·[clIEnt] ·loose-local-infile=1
·如果LOAD DATA LOCAL INFILE在服務器或客戶端被禁用,試圖執行該語句的客戶端將收到下面的錯誤消息:
ERROR 1148: The used command is not allowed with this MySQL version