Skip to content

secure_file_priv

xiaoboluo768 edited this page Jun 14, 2020 · 2 revisions
  • 此变量用于限制data import和export操作,例如由LOAD DATA和SELECT ... INTO OUTFILE语句和LOAD_FILE()函数的操作。这些操作只允许具有FILE权限的用户
    • 该变量有如下有效值:
      • 空串:如果为空,则该变量无效,这是不安全的设置
      • direct name:如果设置为目录的名称,则只允许将导入和导出操作的数据存放目录限制为该值指定的目录。启动mysql时该目录必须存在,服务器不会自己创建
      • null:如果设置为NULL,则将禁用导入和导出操作。从MySQL 5.6.34起允许此值(5.6.34之前的版本没有这个值)
    • 在MySQL 5.6.34之前,默认情况下该变量为空。从5.6.34开始,默认值可以自己指定,源码编译时,要显式指定默认的secure_file_priv值,可以使用INSTALL_SECURE_FILE_PRIVDIR CMake选项,如果编译时没有设置这个选项,则默认情况下mysql不支持load import、export数据
    • 从MySQL 5.6.34开始,服务器在启动时检查secure_file_priv的值,如果该值不安全(如设置为空串),或者该值是datadir或datadir的子目录,或所有用户可访问的目录,则会向错误日志写入警告。如果将secure_file_priv设置为不存在的路径,则服务器会将错误消息写入错误日志并退出启动
    • 全局变量,只读变量,默认值5.6.33及其之前的版本为空串,5.6.34及其之后的5.6.x版本为null,5.7.5及其之前的5.7.x版本为空串,5.7.6及其之后的版本默认值为null
    • PS:
      • 如果load data语句使用了local子句,则客户端使用TCP远程连接mysql server时,没有file权限仍然能够导入文本文件,这个时候是非常危险的,因为local子句的内部原理是从客户端的主机读取文本文件并传送到server端的/tmp目录并保存为一个临时文件,再执行load data语句的。另外,要使用local子句,还需要看server端启动是否关闭了local_infile选项(如果不指定该选项,则服务端默认为ON),mysql client连接时是否关闭了local_infile选项(如果不指定该选项,则客户端默认为ON),local_infile在server或client端任意一端关闭都不能使用local子句,会报错误:ERROR 1148 (42000): The used command is not allowed with this MySQL version
      • 如果load data语句不使用local子句,则这个时候用户必须要有file权限才能够执行导入文本文件(并且只能够导入server端的本地文本文件),如果没有file权限,可能报没有file权限的错误,也可能报错:ERROR 1045 (28000): Access denied for user 'test'@'%' (using password: YES)
      • 如果不想这么麻烦(因为要限制客户端使用local子句在没有file权限的时候使用load data语句,需要在server端使用local_infile=OFF来关闭,不使用local子句时,如果用户没有file权限,那很显然不能够使用load data语句,但是如果还想限制不使用local子句但由具有file权限的用户怎么办?),可以使用参数secure_file_priv=null,设置为null时,全面禁止使用load data语句(不管使用local子句还是不使用都不允许执行load data语句)

上一篇:skip_grant_tables | 下一篇:max_execution_time

Clone this wiki locally