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

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

1、由于LOAD DATA LOCAL是一个SQL语句,解析发生在服务器端,文件从客户机主机到服务器主机的传输由MySQL服务器启动,MySQL服务器告诉客户机语句中命名的文件。理论上,修补过的服务器可以告诉客户端程序传输服务器选择的文件,而不是语句中指定的文件。这样的服务器可以访问客户机上用户具有读取权限的任何文件。(事实上,已修补的服务器可以用文件传输请求回复任何语句,而不仅仅是本地加载数据,因此更根本的问题是客户端不应连接到不受信任的服务器。)
2、在Web环境中,用户可以使用LOAD DATA LOCAL来读取Web服务器进程具有读取权限的任何文件(假设用户可以对SQL服务器运行任何语句)。在这个环境中,MySQL服务器的客户端实际上是Web服务器,而不是连接到Web服务器的用户运行的远程程序。

为了避免连接到不受信任的服务器,客户端可以建立安全连接,并通过使用--ssl mode=verify_identity选项和适当的CA证书进行连接来验证服务器标识。

为避免加载数据问题,除非采取了适当的客户端预防措施,否则客户端应避免使用LOCAL。

为了控制本地数据加载,MySQL允许启用或禁用该功能。此外,从MySQL 8.0.21开始,MySQL允许客户端将本地数据加载操作限制在指定目录中的文件中。

为了使管理员和应用程序能够管理本地数据加载功能,LOCAL配置工作如下:

在服务器端:
1、ocal_infile系统变量控制服务器端LOCAL 的能力。根据 local_infile设置,服务器会拒绝或允许已LOCAL在客户端启用的客户端加载本地数据。默认情况下 local_infile为禁用。

2、确原因服务器拒绝或允许 LOAD DATA LOCAL语句(不管有客户程序和库在构建时或运行时配置),启动mysqld的与 local_infile分别禁用或启用。 local_infile也可以在运行时设置。
默认情况下,“local_infile”不启用要显式导致服务器拒绝或允许LOAD DATA LOCAL语句(无论在生成时或运行时如何配置客户端程序和库),请在禁用或启用local_infile的情况下启动mysqld。local_infile也可以在运行时设置。

在客户端:
ENABLED_LOCAL_inflee CMake选项控制MySQL客户端库的默认本地编译功能(请参阅第2.9.7节“MySQL源配置选项”)。因此,没有显式安排的客户端会根据MySQL构建时指定的enabled_LOCAL_INFILE设置禁用或启用本地功能。
默认情况下,MySQL二进制发行版中的客户端库是在禁用ENABLED_LOCAL_INFILE的情况下编译的。如果从源代码处编译MySQL,请根据没有显式安排的客户端是否应禁用或启用本地功能,将其配置为禁用或启用ENABLED_LOCAL_INFILE。
对于使用C API的客户机程序,本地数据加载能力由编译到MySQL客户机库中的默认值决定。要显式启用或禁用它,请调用mysql_options()C API函数以禁用或启用mysql_OPT_LOCAL_INFILE选项。见第28.7.6.50节,“mysql_options()”。
对于mysql客户机,本地数据加载能力由编译到mysql客户机库中的默认值决定。要显式禁用或启用它,请使用--local infile=0或--local infile[=1]选项。
对于mysqlimport客户端,默认情况下不使用本地数据加载。要显式禁用或启用它,请使用--local=0或--local[=1]选项。

如果在Perl脚本或从选项文件读取[client]组的其他程序中使用LOAD DATA LOCAL,则可以向该组添加本地infile选项设置。要防止不理解此选项的程序出现问题,请使用松散前缀指定它:

[client]
loose-local-infile=0

要么:

[client]
loose-local-infile=1

在所有情况下,LOCAL 客户端成功使用加载操作还需要服务器允许它。

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

ERROR 3950 (42000): Loading local data is disabled; this must be
enabled on both the client and server side