PHP: защита от слов и загруженных файлов

#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);