MySQL会话/用户的FILE权限

时间:2011-09-01 14:06:38

标签: php mysql mysql-error-1045

当我的MySQL数据库中注册了某人时,此功能必须正常工作:

mysql_query("SELECT mail 
               FROM users 
               INTO OUTFILE 'test.txt'");

但是我收到了错误

  

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

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

2 个答案:

答案 0 :(得分:9)

Chek获取该用户的权限:

  

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

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

  

上授予文件。到'registerdb'@'%'

然后:

  

FLUSH PRIVILEGES;

但请注意,在*.*上授予FILE权限时,您基本上是giving that user full access to any file the server

限制limit the location in which files can be read and written, set the secure_file_priv system to a specific directory

答案 1 :(得分:1)

你需要首先删除MySQL以外的文件,MySQL中有无功能可以删除或覆盖文件。
这是一项安全措施,您应该感谢这一事实。

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

我通常使用

LOAD DATA INFILE 'nonexistingfile' INTO validtable

生成的错误为您提供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;    

我不是100%确定你可以使用函数创建OUTFILE参数,否则你必须选择该值并使用动态SQL将其注入查询。

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

SELECT * FROM saved_mail_log WHERE user_id = '1234' ORDER BY whensaved DESC LIMIT 1