Привилегия FILE для сеанса / пользователя MySQL - PullRequest
3 голосов
/ 01 сентября 2011

Когда кто-то зарегистрирован в моей базе данных MySQL, эта функция должна работать:

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

Но я получаю ошибку

Доступ запрещен для пользователя 'registerdb' @ '%' (с использованием пароля: ДА)

Так, как я даю разрешение на запись FILE сеансу / пользователю?

Ответы [ 2 ]

9 голосов
/ 20 сентября 2011

Проверка разрешений этого пользователя:

ПОКАЗАТЬ ГРАНТЫ ДЛЯ 'registerdb' @ '%'

Если в списке нет разрешения FILE, просто добавьте его:

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

, а затем:

ПРИВИЛЕГИИ ПОТОКА;

Но будьте осторожны, предоставляя разрешение FILE на *.*, вы, по сути, предоставляете этому пользователю полный доступ к любому файлу, который сервер .

ограничивает ограничить местоположение, в котором файлы могут быть прочитаны и записаны, установите для системы secure_file_priv определенный каталог .

1 голос
/ 01 сентября 2011

Сначала необходимо удалить файл вне 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
...