#php #ms-word #exec #doc
#php #ms-word #exec #документ
Вопрос:
Я создаю некоторый код, который будет загружать содержимое документа Word на сервер, извлекать его текст и вставлять его в базу данных.
exec("PATH=$PATH:/home1/myserver/bin amp;amp; antiword " .
$_FILES['file']['tmp_name'], $mycontent);
По какой-то странной причине $mycontent всегда является пустым массивом. Google не был настолько полезен. Кто-нибудь знает, что я делаю не так?
Комментарии:
1. Возможно, escape
$PATH
(если вы не определили его самостоятельно).exec("PATH=$PATH...
или используйте одинарные кавычки.2. Спасибо. Забыл это сделать 🙂
Ответ №1:
$PATH в вашей цитате exec пытается быть преобразован в любой ваш PHP $PATH, а не в BASH $PATH.
Вы можете либо экранировать $ ( $
), либо использовать одинарные кавычки.
В общем, вы должны использовать escapeshellarg()
или escapeshellcmd()
, чтобы сделать вещи немного безопаснее. Это предотвратило бы эту ситуацию. Кроме того, если вы вызываете exec()
с помощью пользовательских вводов, это поможет предотвратить их экранирование вашей команды и вызов собственных вредоносных команд оболочки.
Редактировать
На самом деле, по какой-то причине у вас могут возникнуть проблемы с вашим именем файла / путем. Просто начните с простого.
Работает ли это:
exec('/home1/myserver/bin/antiword ' .
escapeshellarg($_FILES['file']['tmp_name']), $mycontent);
Если нет, то что это:
echo '/home1/myserver/bin/antiword ' .
escapeshellarg($_FILES['file']['tmp_name']);
Вам нужно будет создать файл для тестирования и заменить его на файл в $_FILES . Но работает ли это непосредственно из командной строки?
Комментарии:
1. Использовал одинарные кавычки, и все равно не повезло: (
2. Избавьтесь от части пути все вместе, просто введите полный путь для всего, что вам нужно. Если вы используете его для защиты от слов, просто сделайте это
exec('/home1/myserver/bin/antiword ' . escapeshellarg($_FILES['file']['tmp_name']), $mycontent);