【问题标题】:FILE privilege to MySQL session/userMySQL 会话/用户的 FILE 权限
【发布时间】:2011-09-01 14:06:38
【问题描述】:

当有人在我的 MySQL 数据库中注册时,这个功能必须起作用:

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

但我得到了错误

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

那么我如何将 FILE 写入权限授予会话/用户?

【问题讨论】:

  • 作为安全预防措施,MySQL 不会覆盖已经存在的文件。它只会创建新文件。

标签: php mysql mysql-error-1045


【解决方案1】:

检查该用户的权限:

显示 'registerdb'@'%' 的授权

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

GRANT FILE ON . 到 'registerdb'@'%'

然后:

刷新特权;

但请注意,通过授予 *.* 的 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

【讨论】:

  • 很好的答案。应该在顶部,而不是另一个。
  • 但要注意,通过在 *.* 上执行授权文件,您实际上是在为该用户提供通过服务器对任何内容的完整文件访问权限。确保你非常信任他/她
【解决方案2】:

你需要先删除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

【讨论】:

  • 我仍然无法使用查询 sql_query("SELECT mail FROM users INTO OUTFILE 'test.txt'");即使文件不存在....所以解决方案必须是授予我的会话/用户权限,但我该怎么做呢?
  • 你使用的是哪个 MySQL 版本??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 2012-04-28
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多