MYSQL8.0中关于load data infile命令

MYSQL8.0中关于load data infile命令

提醒:遇到软件不同版本时,参考文档才是最佳的学习资料。

在学习mysql注入时认识了 LOAD DATA INFILE 语句。在注入时我们会需要一些特殊的文件,如配置文件,密码文件等。当拥有数据库权限时,可以将系统文件利用 load data infile 导入数据库中。
根据官方文档,了解该语句语法:

LOAD XML
    [LOW_PRIORITY | CONCURRENT] [LOCAL]
    INFILE 'file_name'
    [REPLACE | IGNORE]
    INTO TABLE [db_name.]tbl_name
    [CHARACTER SET charset_name]
    [ROWS IDENTIFIED BY '<tagname>']
    [IGNORE number {LINES | ROWS}]
    [(field_name_or_user_var
        [, field_name_or_user_var] ...)]
    [SET col_name={expr | DEFAULT}
        [, col_name={expr | DEFAULT}] ...]

首先我建了一个这样的表:
在这里插入图片描述

然后我意图将这个文档的内容插入表中
在这里插入图片描述
首先查看local_infile,将其开启为ON。

mysql >set global local_infile=1;
mysql> show global variables like 'local_infile'; 
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | ON    |
+---------------+-------+

但是出现报错,通过参考文档发现高版本mysql将本地数据加载操作限制在了指定文档中。
在这里插入图片描述

//找到指定文件夹
mysql> show variables like '%secure%'; 
+--------------------------+------------------------------------------------+
| Variable_name            | Value                                          |
+--------------------------+------------------------------------------------+
| require_secure_transport | OFF                                            |
| secure_file_priv         | C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\ |
+--------------------------+------------------------------------------------+
//也有root权限
mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+

//存在报错;
mysql> load data local infile 'C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Uploads\\2.txt' into table test2 fields terminated by '\n';
ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.

发现 local 删掉就不会报错了?

LOCAL:
该关键字影响文件的预期读取位置及错误句柄。需要客户端及服务端都开启该选项,如果mysqld的启动参数包含local-infile=0,那么指定该参数是无效的。
使用时,客户端程序读取文件并将其内容发送到服务器。服务器在存储临时文件的目录中创建文件的副本,如果此目录中缺少足够的空间来存储副本,则也可能导致 LOAD DATA LOCAL 语句失败。

mysql> load data infile 'C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Uploads\\2.txt' into table test2 fields terminated by '\n';
Query OK, 4 rows affected (0.00 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

//这样也可以
mysql> load data infile 'C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Uploads\\2.txt' ignore into table test2 character set gbk fields terminated by '\t' lines terminated by '\n';
//将 2.txt 导入到 test2 表中,character set gbk 是字符集设置为 gbk,fields terminated by 是每一项数据之间的分隔符,lines terminated by 是行的结尾符。
Query OK, 4 rows affected (0.00 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

随后我添加了环境变量,从cmd中进入mysql,成功使用 load data local infile 语句。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
还要注意:
表中字段的类型要与输入数据类型对应,即为varchar即字符串类型,才能写进去;
查看 secure_file_priv 属性设置是否正确;
高版本的mysql如果是空值应该要写NULL或者0,否则会报错 Incorrect integer value: ” for column ‘id’ at row 1,但是这里只设置了一列因而不会有这个错;
在windows下, 路径可以为斜杠 ‘/’ 或双反斜杠 ‘\\’ 。

官方文档中也提到了安全要求:
对于非加载操作,服务器读取位于服务器主机上的文本文件,因此必须满足以下安全要求:
必须具有 FILE 权限,该操作受 secure_file_priv 系统变量设置的约束:

  • 如果变量值是非空目录名,则文件必须位于该目录中。
  • 如果变量值为空(不安全),则服务器只需读取该文件。

对于装入操作,客户端程序读取位于客户端主机上的文本文件。由于文件内容是通过客户端与服务器的连接发送的,因此使用速度比服务器直接访问文件时慢一些。另一方面,您不需要 FILE 特权,并且该文件可以位于客户端程序可以访问的任何目录中。

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值