MySQL 8.0 参考手册  / 第 6 章 安全  / 6.1 一般安全问题  /  6.1.6 LOAD DATA LOCAL 的安全注意事项

6.1.6 LOAD DATA LOCAL 的安全注意事项

LOAD DATA语句将数据文件加载到表中。该语句可以加载位于服务器主机上的文件,或者如果LOCAL指定了关键字,则可以加载客户端主机上的文件。

LOCAL版本LOAD DATA有两个潜在的安全问题:

  • 因为LOAD DATA LOCAL是一条SQL语句,解析发生在服务器端,文件从客户端主机到服务器主机的传输是由MySQL服务器发起的,它告诉客户端语句中命名的文件。理论上,打过补丁的服务器可以告诉客户端程序传输服务器选择的文件,而不是声明中指定的文件。这样的服务器可以访问客户端用户具有读取权限的客户端主机上的任何文件。(打过补丁的服务器实际上可以用文件传输请求回复任何语句,而不仅仅是 LOAD DATA LOCAL,所以一个更基本的问题是客户端不应该连接到不受信任的服务器。)

  • 在客户端从 Web 服务器连接的 Web 环境中,用户可以 LOAD DATA LOCAL用来读取 Web 服务器进程具有读取权限的任何文件(假设用户可以对 SQL 服务器运行任何语句)。在这种环境下,MySQL服务器的客户端实际上是Web服务器,而不是连接到Web服务器的用户运行的远程程序。

为避免连接到不受信任的服务器,客户端可以建立安全连接并通过使用--ssl-verify-server-cert 选项和适当的 CA 证书进行连接来验证服务器身份。要实施此级别的验证,您必须首先确保服务器的 CA 证书对副本可靠可用,否则会导致可用性问题。有关详细信息,请参阅 加密连接的命令选项

为避免出现LOAD DATA问题,客户应避免使用LOCAL.

管理员和应用程序可以配置是否允许本地数据加载,如下所示:

  • 在服务器端:

    • local_infile系统变量控制服务器端的 能力LOCAL 。根据 local_infile设置,服务器拒绝或允许请求本地数据加载的客户端加载本地数据。

    • 默认情况下,local_infile 启用。要使服务器 LOAD DATA LOCAL显式拒绝或允许语句(无论客户端程序和库在构建时或运行时如何配置),请以 禁用或启用的方式启动mysqld 。也可以在运行时设置。 local_infilelocal_infile

  • 在客户端:

    • CMake选项控制 MySQL 客户端库 的编译默认功能(请参阅 第 2.9.7 节,“MySQL 源配置选项”)。因此,没有明确安排的客户端 根据 MySQL 构建时指定的设置禁用或启用功能。 ENABLED_LOCAL_INFILE LOCALLOCALENABLED_LOCAL_INFILE

    • 默认情况下,MySQL 二进制发行版中的客户端库是在 ENABLED_LOCAL_INFILE 启用的情况下编译的。如果您从源代码编译 MySQL,请ENABLED_LOCAL_INFILE 根据未做出明确安排的客户端是否应LOCAL 禁用或启用功能来将其配置为禁用或启用。

    • 对于使用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 脚本或其他从选项文件 LOAD DATA LOCAL中读取组的程序中使用,则可以向该组添加选项设置。为防止不理解此选项的程序出现问题,请使用 前缀指定它: [client]local-infileloose-

      [client]
      loose-local-infile=0

      或者:

      [client]
      loose-local-infile=1
    • 在所有情况下,客户端成功使用LOCAL 加载操作还需要服务器允许本地加载。

如果LOCAL禁用功能,则在服务器端或客户端,尝试发出 LOAD DATA LOCAL语句的客户端会收到以下错误消息:

ERROR 1148: The used command is not allowed with this MySQL version