在这里插入图片描述
上面图片是AI创作未经允许,不可商用哦!如有更多需要,可私戳!

问题

执行项目过程中意外出现的报错,之前也没有遇到过
报错信息如下

Error 3948 (42000): Loading local data is disabled; 
this must be enabled on both the client and server sides

翻译如下

在这里插入图片描述


排查

看报错信息感觉是和数据库有一定关系网上搜索错误,也都直指mysql中的一个参数local_infile

需要指定参数开启状态可以解决问题

解决

那就废话不多说,我们解决问题,再去分析

查看是否开启加载本地文件

show variables like 'local_infile';

下图local_infile的值为off,确实是关闭状态
在这里插入图片描述

开启全局本地文件设置

 set global set local_infile=on;set global set local_infile=true;

再次查看下图local_infile的值变为on开启状态了:
在这里插入图片描述

再去执行项目发现确实没有了报错,成功解决
如果不需要深究原因的话,那就可以到此为止了,可以先收藏吃灰,后面有时间了再来看看


原因分析

local_infile理解

MySQL服务端参数:local_infile 用于控制MySQL Server是否允许使用LOAD DATA LOCAL INFILE命令导入存放客户端数据文件
MySQL客户端参数:–local-infile 用于控制MySQL Client是否允许使用LOAD DATA LOCAL INFILE命令导入存放客户端数据文件

mysql官方解释:local_infile:
在这里插入图片描述

mysql版本原因

mysql5.0之后的版本安装默认设置是禁止本地批量导入导出数据,出于安全考虑

首先确定一下我的mysql版本

select version();

下图mysql 8版本,所以local_infile关闭状态是正常的
在这里插入图片描述

版本mysql默认关闭local_infile的原因

我们知道local_infile参数的含义是将数据文件加载表中可以加载位于服务器主机上的文件,或者如果指定了关键字,则可以加载客户端主机上的文件

官方理解

将local_infile设置开启状态会有两个潜在的安全问题

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

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

简洁理解

感谢老哥的支持高度概括:bluetata

LOCAL_INFILE允许用户在本地文件中读取数据
当LOCAL_INFILE设置为ON时,MySQL服务器允许客户端从本地文件中读取数据,并将其加载到MySQL表中,从而提高了MySQL服务器的性能

MySQL 中的 local_infile 可以允许用户将本地文件加载到 MySQL服务器中,但是它存在一些安全隐患由于它允许在服务器上加载本地文件,因此可能存在远程拒绝服务攻击风险。此外,由于加载数据过程涉及到对服务器文件系统访问,因此也可能导致恶意的本地攻击

其他

关于参数local_infile更多的解释注意事项,可以参考官方内容LOAD DATA LOCAL 的安全注意事项

原文地址:https://blog.csdn.net/m0_37482190/article/details/129412249

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_23526.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注