8.1.6 Меры безопасности для LOAD DATA LOCAL
Выполнение команды LOAD DATA загружает данные из файла в таблицу. Команда может загрузить файл, расположенный на сервере, или, если указан ключевой параметр LOCAL, на хосте клиента.
В версии LOCAL команды LOAD
DATA существует две потенциальные проблемы безопасности:
Поскольку
LOAD DATA LOCALявляется SQL-командой, её парсинг выполняется на серверной стороне, а передача файла с хоста клиента на серверный хост инициируется сервером MySQL, который сообщает клиенту имя файла из команды. Теоретически, модифицированный сервер может сообщить клиентской программе о передаче файла по выбору сервера, а не файла, указанного в команде. Такой сервер может получить доступ к любому файлу на хосте клиента, к которому у клиентского пользователя есть права на чтение. (На самом деле, модифицированный сервер может ответить запросом на передачу файла для любой команды, а не толькоLOAD DATA LOCAL, поэтому более фундаментальной проблемой является то, что клиенты не должны подключаться к ненадежным серверам.)В веб-среде, где клиенты подключаются с веб-сервера, пользователь может использовать
LOAD DATA LOCALдля чтения любых файлов, к которым у процесса веб-сервера есть доступ на чтение (предполагается, что пользователь может выполнить любую команду на SQL-сервере). В этой среде клиент с точки зрения MySQL-сервера фактически является веб-сервером, а не удалённой программой, запущенной пользователями, которые подключаются к веб-серверу.
Чтобы избежать подключения к ненадежным серверам, клиенты могут установить защищённое соединение и проверить идентичность сервера, подключившись с использованием параметра --ssl-mode=VERIFY_IDENTITY и соответствующего сертификата CA. Для реализации этой проверки необходимо, прежде всего, убедиться, что сертификат CA для сервера надёжно доступен реплике, в противном случае возникнут проблемы с доступностью. Более подробная информация представлена в разделе Параметры команд для шифрованных соединений.
Чтобы избежать проблем с LOAD DATA, клиенты должны избегать использования LOCAL, пока не будут приняты надлежащие меры предосторожности на стороне клиента.
Для управления загрузкой локальных данных MySQL позволяет включить или отключить эту возможность. MySQL также позволяет клиентам ограничивать операции загрузки локальных данных файлами, расположенными в заданном каталоге.
Включение или отключение возможности загрузки локальных данных
Администраторы и приложения могут настроить разрешение загрузки локальных данных следующим образом:
-
На стороне сервера:
Переменная системы
local_infileуправляет возможностьюLOCALна стороне сервера. В зависимости от настройкиlocal_infileсервер отказывается или разрешает загрузку локальных данных клиентами, запрашивающими загрузку локальных данных.-
По умолчанию,
local_infileотключена. (Это изменение по сравнению с предыдущими версиями MySQL.) Чтобы заставить сервер явно отклонять или допускать выполнение командLOAD DATA LOCAL(независимо от того, как клиентские программы и библиотеки настроены во время компиляции или выполнения), запустите mysqld сlocal_infileотключённой или включённой.local_infileтакже может быть установлена во время выполнения.
-
На стороне клиента:
-
Параметр
ENABLED_LOCAL_INFILECMake управляет включённой по умолчанию возможностьюLOCALдля библиотеки MySQL-клиента (см. Раздел 2.8.7, «Параметры конфигурации MySQL исходного кода»). Клиенты, не принимающие явных соглашений, поэтому имеют возможностьLOCALотключённую или включённую в соответствии с настройкойENABLED_LOCAL_INFILE, указанной во время сборки MySQL. По умолчанию, клиентская библиотека в двоичных дистрибутивах MySQL скомпилирована с
ENABLED_LOCAL_INFILEотключённой. Если вы компилируете MySQL из исходного кода, настройте его сENABLED_LOCAL_INFILEотключённой или включённой в зависимости от того, должна ли быть возможностьLOCALотключена или включена для клиентов, не делающих явных соглашений.-
Для клиентских программ, использующих API C, возможность загрузки локальных данных определяется по умолчанию, скомпилированной в библиотеку MySQL-клиента. Чтобы явно включить или отключить её, вызовите функцию API C для отключения или включения параметра
MYSQL_OPT_LOCAL_INFILE. См. . -
Для клиента mysql возможность загрузки локальных данных определяется по умолчанию, скомпилированной в библиотеку MySQL-клиента. Чтобы явно отключить или включить её, используйте параметр
--local-infile=0или--local-infile[=1]. -
Для клиента mysqlimport загрузка локальных данных по умолчанию не используется. Чтобы явно отключить или включить её, используйте параметр
--local=0или--local[=1]. -
Если вы используете
LOAD DATA LOCALв скриптах Perl или других программах, которые читают группу[client]из файлов конфигурации, вы можете добавить настройку параметраlocal-infileв эту группу. Чтобы предотвратить проблемы для программ, которые не понимают этот параметр, укажите его с использованием префиксаloose-:[client] loose-local-infile=0
или:
[client] loose-local-infile=1
Во всех случаях успешное выполнение операции загрузки локальных данных клиентом также требует, чтобы сервер разрешил локальную загрузку.
-
Если возможность 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 используют эту возможность.
Клиентские программы, использующие API на C, могут управлять разрешенными файлами для загрузки данных, используя опции MYSQL_OPT_LOCAL_INFILE и MYSQL_OPT_LOAD_DATA_LOCAL_DIR функции API на C (см. ).
Действие 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следующая:Если значение является нулевым указателем (по умолчанию), это не назначает каталог, в результате чего для загрузки данных
LOCALне разрешены никакие файлы.Если значение является путем к каталогу, загрузка данных
LOCALразрешена, но ограничена файлами, расположенными в указанном каталоге. Сравнение имени пути к каталогу и имени пути к загружаемым файлам чувствительно к регистру, независимо от чувствительности к регистру файловой системы.
Программы клиента MySQL используют указанные опции следующим образом:
-
Клиент mysql имеет опцию
--load-data-local-dir, которая принимает путь к каталогу или пустую строку. mysql использует значение опции для установки опцииMYSQL_OPT_LOAD_DATA_LOCAL_DIR(пустая строка устанавливает значение в нулевой указатель). Действие опции--load-data-local-dirзависит от того, включена или выключена загрузка данныхLOCAL:Если загрузка данных
LOCALвключена, по умолчанию в библиотеке клиента MySQL или с помощью указания--local-infile[=1], опция--load-data-local-dirигнорируется.Если загрузка данных
LOCALвыключена, по умолчанию в библиотеке клиента MySQL или с помощью указания--local-infile=0, опция--load-data-local-dirприменяется.
Когда опция
--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 с помощью утилиты параллельного импорта таблиц MySQL Shell, импортировать в другое приложение или использовать в качестве логического резервного копирования. Утилита имеет предопределённые опции и опции настройки для создания различных форматов вывода.
- Утилита параллельного импорта таблиц
util.importTable() Импортирует файл данных в реляционную таблицу MySQL. Файл данных может быть результатом работы утилиты экспорта таблиц MySQL Shell или другого формата, поддерживаемого предопределенными и настраиваемыми опциями утилиты. Утилита может выполнять предварительную обработку ввода перед добавлением данных в таблицу. Она может принимать несколько файлов данных для объединения в одну реляционную таблицу и автоматически распаковывать сжатые файлы.
- Утилита дампа экземпляра
util.dumpInstance(), утилита дампа схемыutil.dumpSchemas()и утилита дампа таблицыutil.dumpTables() Экспортирует экземпляр, схему или таблицу в набор файлов дампов, которые затем можно загрузить в экземпляр MySQL с помощью утилиты загрузки дампов MySQL Shell. Утилиты предоставляют потоковую передачу данных Oracle Cloud Infrastructure Object Storage, проверки и модификации совместимости с HeatWave Service и возможность проведения пробного выполнения для выявления проблем перед продолжением дампа.
- Утилита загрузки дампов
util.loadDump() Импортирует файлы дампов, созданные с помощью утилиты дампа экземпляра, схемы или таблицы MySQL Shell, в HeatWave Service DB System или экземпляр сервера MySQL. Утилита управляет процессом загрузки и предоставляет потоковую передачу данных из удаленного хранилища, параллельную загрузку таблиц или фрагментов таблиц, отслеживание состояния прогресса, возможность возобновления и сброса, а также возможность одновременной загрузки во время выполнения дампа. Утилиту параллельного импорта таблиц MySQL Shell можно использовать в сочетании с утилитой загрузки дампов для изменения данных перед их загрузкой в целевой экземпляр MySQL.
Для получения подробных сведений об утилитах см. .
© 2025 Oracle
Licensed under the GPLv2 License.