6.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.
Администраторы и приложения могут настроить разрешение загрузки локальных данных следующим образом:
-
На стороне сервера:
Переменная среды
local_infileуправляет возможностьюLOCALна стороне сервера. В зависимости от значенияlocal_infile, сервер отклоняет или разрешает загрузку локальных данных клиентами, которые запрашивают загрузку локальных данных.-
По умолчанию,
local_infileвключена. Чтобы заставить сервер явно отклонить или разрешить операторы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 1148: The used command is not allowed with this MySQL version
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, проверки и модификации совместимости с MySQL HeatWave Service, а также возможность проведения пробного запуска для выявления проблем перед продолжением выгрузки.
- Утилита загрузки выгрузки
util.loadDump() Импортирует файлы выгрузки, созданные с помощью утилиты выгрузки экземпляра, схемы или таблицы MySQL Shell, в систему баз данных MySQL HeatWave Service или экземпляр MySQL Server. Утилита управляет процессом загрузки и предоставляет потоковую передачу данных из удаленного хранилища, параллельную загрузку таблиц или фрагментов таблиц, отслеживание состояния прогресса, возможности возобновления и сброса, а также возможность одновременной загрузки, пока выгрузка еще выполняется. Утилиту параллельного импорта таблиц MySQL Shell можно использовать в сочетании с утилитой загрузки выгрузки для изменения данных перед загрузкой их в целевой экземпляр MySQL.
Подробности об утилитах см. .
© 2025 Oracle
Licensed under the GPLv2 License.