#php #mysql #apache
#php #mysql #apache
Вопрос:
Apache2 / PHP имеет доступ ко всем таблицам / базам данных на сервере MySQL, необходимым для пользовательского интерфейса. Я хотел бы создать возможность быстрого и безопасного экспорта любой из этих таблиц в формате CSV без необходимости создания модуля экспорта для каждой отдельной таблицы.
В настоящее время у меня есть следующее
$file = '/tmp/' . $_POST['table'] . '_export.csv';
$table = $_POST['table'];
$sql = 'SELECT * INTO OUTFILE "' . $file . '"
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY "n"
FROM ' . $table;
$db->query($sql);
file_put_contents('php://output', file_get_contents($file));
unlink($file);
Это создает экспорт /tmp
для экспорта таблицы, однако Apache2 не имеет разрешений на доступ /tmp
, поскольку PrivateTmp=yes
, а также разрешения экспортируемого файла rw-r-----
.
Я пробовал изменять sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
и добавлять:
secure-file-priv = /var/lib/mysql-files
Затем создайте скрипт, запускаемый root (исполняемый всеми), который перемещает файлы и правильно устанавливает разрешения. Однако это не только не элегантно, secure-file-priv
но, похоже, не меняется даже после перезапуска MySQL:
mysql> SELECT @@GLOBAL.secure_file_priv;
---------------------------
| @@GLOBAL.secure_file_priv |
---------------------------
| /tmp/ |
---------------------------
1 row in set (0.00 sec)
Пожалуйста, обратите внимание: я использую MySQL 8.0.22, и исправления из других потоков, похоже, не помогают.
Каков наилучший способ сделать это?