MySQL会话/用户的FILE权限

Fra*_*els 3 php mysql mysql-error-1045

当有人在我的MySQL数据库中注册时,此函数必须工作:

mysql_query("SELECT mail 
               FROM users 
               INTO OUTFILE 'test.txt'");
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误

用户'registerdb'@'%'的访问被拒绝(使用密码:YES)

那么我如何给会话/用户提供FILE写权限?

小智 9

Chek用于该用户的权限:

为'registerdb'@'%'显示资助

如果没有列出的FILE权限,只需添加它:

授予文件.'registerdb'@'%'

然后:

FLUSH特权;

但要注意,通过授予您的FILE权限,*.*本质上是允许该用户完全访问服务器的任何文件.

要限制可以读取和写入文件的位置,请将secure_file_priv系统设置为特定目录.


Joh*_*ica 1

您需要先删除MySQL之外的文件,MySQL中没有可以删除或覆盖文件的函数。
这是一项安全措施,您应该对此表示感谢。

请注意,找出 MySQL 存储文件的确切位置可能很棘手。

我通常使用

LOAD DATA INFILE 'nonexistingfile' INTO validtable
Run Code Online (Sandbox Code Playgroud)

生成的错误为您提供将SELECT ... INTO OUTFILE写入的当前数据库的完整路径。
您可以使用多种方法来删除(或更好地移动)文件,我cron-job想到了一种方法。
您甚至可以编写一个自定义 UDF 来为您执行删除操作,尽管这是一个巨大的安全风险,而这样做的程序员应该遭受比可怕的事情更糟糕的命运。

另一种选择是做

START TRANSACTION;
SELECT @today:= CURDATE();
INSERT INTO saved_mail_log (filename, whensaved, user_id) 
  VALUES (CONCAT(@today,'mailsave.csv'), @today, '1234');
SELECT mail FROM users WHERE user_id = '1234' INTO OUTFILE CONCAT(@today,'mailsave.csv');
COMMIT;    
Run Code Online (Sandbox Code Playgroud)

我不是 100% 确定您可以使用函数来创建OUTFILE参数,如果不是,您将必须选择该值并使用动态 SQL 将其注入到查询中。

您可以使用以下方式获取最新文件:

SELECT * FROM saved_mail_log WHERE user_id = '1234' ORDER BY whensaved DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud)