MySQL 学习笔记(五)安全性 (待续)

LOAD DATA LOCAL安全问题

LOAD DATA语句可以装载服务器主机上的文件,如果指定了关键字LOCAL, 则可以装载客户端文件。

因此,支持LOCAL版本的LOAD DATA可能存在两个方面的安全问题:

  1. 由MySQL服务器启动文件从客户端向服务器主机的传输,理论上,打过补丁的服务器可以告诉客户端程序传输服务器选择的文件,而不是客户用LOAD DATA语句指定的文件。这样服务器可以访问客户端上客户有读访问权限的任何文件。

  2. 在WEB环境中,客户从WEB服务器连接,用户可以使用LOAD DATA LOCAL语句来读取WEB服务器进程有读访问权限的任何文件,在这种环境,Mysql 服务器的客户实际上是WEB 服务器,而不是连接WEB服务器的用户运行的程序。

为了避免上述LOAD DATA问题,客户端应避免使用LOCAL。 而且为了避免连接到不受信任的服务器,客户端可以建立安全连接,并验证连接。

可以用-local-infile = 0 从服务端禁用所有的LOAD DATA。

1
2
3
4
5
C:\Users\User>mysql -uroot -p --local-infile=0
Enter password: **********

mysql> load data local infile 'D:/mysql-5.7.13/teacher.txt' into table t;
ERROR 1148 (42000): The used command is not allowed with this MySQL version

相对的,可以通过-local-infile[=1]选项启用Load data local。

1
2
3
4
5
6
C:\Users\User>mysql -uroot -p --local-infile=1
Enter password: **********

mysql> load data local infile 'D:/mysql-5.7.13/teacher.txt' into table t;
Query OK, 4 rows affected (0.07 sec)
Records: 4 Deleted: 0 Skipped: 0 Warnings: 0

[1]. 参考: https://dev.mysql.com/doc/refman/5.7/en/entering-queries.html

如果觉得对您有帮助,就扫我交个朋友吧!