Надежно используя exec-функцию PHP - PullRequest
4 голосов
/ 19 января 2012

Я пишу скрипт PHP, предназначенный для запуска исполняемого файла (ffmpeg.exe) через функцию exec ().Проблема в том, что я прочитал, что использование функции exec () может быть угрозой безопасности, и по возможности его следует избегать.Я провел некоторое исследование о том, как безопасно выполнять функцию exec (), и единственное, с чем я сталкиваюсь, это фильтровать командную строку с помощью escapeshellcmd или escapeshellarg.Я хочу знать, возможно ли дальнейшее повышение безопасности при использовании функции exec () или есть безопасная альтернатива exec ().Любая помощь будет оценена.

Вот мой код;

define('FFMPEG_LIBRARY', 'c:\\ffmpeg7\\ffmpeg\\bin\\ffmpeg ');
$transcode_string = FFMPEG_LIBRARY." -i " . $srcFile . " -acodec libmp3lame -ab 64k -ar 22050 -ac 1 -vcodec libx264 -b:v 250k -r 30 -f flv -y " . $destFile;
$transcode_string = escapeshellcmd($transcode_string);
exec($transcode_string);

$ srcFile - это, в основном, видео для транскодирования, а $ destFile - выходной файл, который я хочу создать.

Ответы [ 2 ]

3 голосов
/ 19 января 2012

использование функции exec () может быть угрозой безопасности, и по возможности ее следует избегать.

Это немного обобщает - вполне возможно создать безопасное решение, используяexec().Но это действительно сложно: есть много подводных камней при выполнении внешних программ, особенно если вы передаете им внешние параметры.

Первый шаг, как вы говорите, состоит в том, чтобы избежать всего, используя escapeshellarg() для предотвращения внедрениядругих, возможно, вредных команд.

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

  • при выполнении операции ffmpeg для видео размером 200000 x 200000 пикселей вполне может вызвать зависание сервера, поскольку вызов пытается выделить невозможный объем памяти.Поэтому вам нужно очистить значения размера, которые пользователь может ввести, и выйти, если они слишком большие или не слишком большие.

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

И так далее, и так далееon.

Также вам нужно подумать о возможности уничтожения сервера с помощью простого количества запросов.Что если я отправлю 50 запросов в секунду в скрипт PHP, который в свою очередь вызывает сложную команду ffmpeg?Сервер может легко сломаться под нагрузкой, и вы можете захотеть защититься от этого.

Итак: при использовании exec() не существует внутренней проблемы безопасности, но к каждому входящему параметру, который ему передается, нужно очень внимательно относиться.

3 голосов
/ 19 января 2012

exec сам по себе не проблема, проблема в том, что вы определенно не должны принимать пользовательский ввод, когда дело доходит до помещения его в exec ().Вы должны всегда использовать escapeshellarg (), но если вам все-таки нужно принять пользовательский ввод, вы должны сначала выполнить собственную очистку и манипуляцию во всех случаях.

Каков именно ваш код?Не видя, что больше нечего сказать по этому вопросу.

Обновление

Если $ srcFile - это имя загруженного файла, то вы должны изменить его .. @ preinheimer Комментарий содержит хорошийидея, вы можете вызвать uniqid ();и переименуйте $ srcFile в это, тогда вы знаете, что у вас есть буквенно-цифровое имя файла независимо от того, что они загрузили.Измените $ srcFile на новое имя файла uniqid (), и все готово.

Что касается $ dstFile, установите для него что-то уникальное, вы можете либо вызвать uniqid ();еще раз или используйте текущее время.

Если вы сделаете обе эти вещи, то вы вообще не принимаете ввод пользователя, и ваш сценарий будет совершенно безопасным и надежным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...