Spec-Zone.ru › MySQL 8.4

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 также позволяет клиентам ограничивать операции загрузки локальных данных файлами, расположенными в заданном каталоге.

  • Включение или отключение возможности загрузки локальных данных

  • Ограничение файлов, разрешённых для загрузки локальных данных

  • MySQL Shell и загрузка локальных данных

Включение или отключение возможности загрузки локальных данных

Администраторы и приложения могут настроить разрешение загрузки локальных данных следующим образом:

  • На стороне сервера:

    • Переменная системы local_infile управляет возможностью LOCAL на стороне сервера. В зависимости от настройки local_infile сервер отказывается или разрешает загрузку локальных данных клиентами, запрашивающими загрузку локальных данных.

    • По умолчанию, local_infile отключена. (Это изменение по сравнению с предыдущими версиями MySQL.) Чтобы заставить сервер явно отклонять или допускать выполнение команд LOAD DATA LOCAL (независимо от того, как клиентские программы и библиотеки настроены во время компиляции или выполнения), запустите mysqld с local_infile отключённой или включённой. local_infile также может быть установлена во время выполнения.

  • На стороне клиента:

    • Параметр ENABLED_LOCAL_INFILE CMake управляет включённой по умолчанию возможностью 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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/load-data-local-security.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API