LO钽吟篑瑜ADDATA语句可以装载服务器主机上的文件,若指定LOCAL关键字,可以装载客户端文件。
支持LOCAL版本的LOADDATA语句有两个可能的安全问题:
由MySQL服务器启动文件从客户端向服务器主机的传输。理论上,打过补丁的服务器可以告诉客户端程序传输服务器选择的文件,而不是客户用LOADDATA语句指定的文件。这样服务器可以访问客户端上客户有读访问权限的任何文件。
在Web环境中,客户从Web服务器连接,用户可以使用LOADDATALOCAL来读取Web服务器进程有读访问权限的任何文件(假定用户可以运行SQL服务器的任何命令)。在这种环境中,MySQL服务器的客户实际上是Web服务器,而不是连接Web服务器的用户运行的程序。
要处理这些问题,我们更改了MySQL3.23.49和MySQL4.0.2(Windows中的4.0.13)中的LOADDATALOCAL的处理方法:
默认情况下,现在所有二进制分中的发MySQL客户端和库是用--enable-local-infile选项编译,以便与MySQL3.23.48和以前的版本兼容。
如果你从源码构建MySQL但没有使用--enable-local-infile选项来进行configure,则客户不能使用LOADDATALOCAL,除非显式调用mysql_options(...MYSQL_OPT_本地_INFILE,0)。
你可以用--local-infile=0选项启动mysqld从服务器端禁用所有LOADDATALOCAL命令。
对于mysql命令行客户端,可以通过指定--local-infile[=1]选项启用LOADDATALOCAL,或通过--local-infile=0选项禁用。类似地,对于mysqlimport,--localor-L选项启用本地数据文件装载。在任何情况下,成功进行本地装载需要服务器启用相关选项。
如果你使用LOADDATALOCALPerl脚本或其它读选项文件中的[client]组的程序,你可以在组内添加local-infile=1选项。但是,为了便面不理解local-infile的程序产生问题,则规定使用loose-prefix:
·[client]
·loose-local-infile=1
如果LOADDATALOCALINFILE在服务器或客户端被禁用,试图执行该语句的客户端将收到下面的错误消息:
ERROR1148:TheusedcommandisnotallowedwiththisMySQLversion