#php #security #phpword
#php #Безопасность #phpword
Вопрос:
Я использую библиотеку (PHPWord) для обработки данных, которые требуют записи файла на диск. Однако часть обрабатываемой информации потенциально конфиденциальна, и эта система предназначена только для обработки данных и отправки их туда, где они будут надежно сохранены. По этой причине я хочу избежать записи каких-либо данных на диск и работать только с данными в памяти.
Итак, мой вопрос: есть ли в PHP какая-то функция, которую я могу использовать, которая удовлетворит требованиям библиотеки к доступному для записи местоположению файла, не позволяя данным стать доступными в файловой системе, и позволит мне получить файл как переменную? Если нет, есть ли обходной путь, о котором я, возможно, не думаю для решения этой дилеммы? Я использую PHP7 в системе Debian Linux, но решение, зависящее от операционной системы, все равно было бы предпочтительнее.
Комментарии:
1.
php://memory
иphp://temp
или, возможноphp://output
, буферизовать его, а затем получить его после.2. Пожалуйста, имейте в виду, что некоторые из предложений AbraCadaver могут фактически сохранять данные в файле при некоторых обстоятельствах. Смотрите: php.net/manual/en/wrappers.php.php
3. Да,
temp
может быть, если память заполнена.
Ответ №1:
Благодаря комментарию @AbraCadaver я нашел работоспособное решение.
При создании файла PHPWord выполняет внутреннюю запись во временное местоположение, поэтому требуется изменение конфигурации, чтобы избежать временной записи данных на диск.
Я добавил tempDir = "php://memory"
в файл phpword.ini.dist
конфигурации библиотеки, чтобы он записывал временный файл в память вместо временного каталога в файловой системе.
Теперь, очевидно, мне также нужно было сделать что-то подобное для местоположения, в которое он будет записывать конечный файл. Использование php://memory не было вариантом для этого, поскольку PHPWord закрывает дескриптор файла после завершения записи. Поэтому мне пришлось немного злоупотребить php://output . Вот примерно то, что я в итоге сделал в своем коде:
$PhpWord = new PhpOfficePhpWordPhpWord();
$section = $PhpWord -> addSection();
$section -> addText("Test text");
// Write the document
$writer = PhpOfficePhpWordIOFactory::createWriter($PhpWord, 'Word2007');
ob_start();
$writer -> save('php://output');
$document = ob_get_clean(); // Document file is now contained in $document