функция exec в PHP и passthru?
Вопрос
Здравствуйте, у меня есть пара вопросов о PHP exec() и passthru().
1)
Я никогда не использовал exec() в PHP, но я видел, что иногда он используется с imagemagick.Теперь мне любопытно, каковы некоторые другие распространенные области применения, где exec хорош в веб-приложении?
2)
Около 6 лет назад, когда я впервые начал играть с PHP, я на самом деле ничего не знал, только самые простые вещи, и у меня был сайт, который был взломан, и кто-то настроил там собственный PHP-файл, который использовал функцию passthru () для передачи большого количества трафика через мой сайт для загрузки бесплатной музыки или видео, и я получил плату за пропускную способность в размере 4000 долларов с моего хостинга!6 лет спустя я знаю намного больше о том, как использовать PHP, но я все еще не понимаю, как это вообще происходило со мной раньше.Как кто-то может добавить файл на мой сервер с помощью неправильного кода?
Решение
1] Exec() действительно полезен, когда вы:
А) Хотите запустить программу/утилиту на сервере, для которого в php нет эквивалента команды.Например, ffmpeg — это обычная утилита, запускаемая через вызов exec (для всех видов преобразования мультимедиа).
Б) Запуск другого процесса, который вы можете заблокировать или НЕ блокировать, — это очень мощно.Однако иногда вам нужен pcnt_fork или аналогичный вместе с правильными аргументами CL для неблокировки.
C) Другой пример: когда мне нужно обработать XSLT 2.0, мне нужно выполнить exec() небольшой запущенный мной Java-сервис для обработки преобразований.Очень кстати.PHP не поддерживает преобразования XSLT 2.0.
2] Черт, как жаль.Ну, много способов.Существует семейство уязвимостей под названием «уязвимости, включающие удаленный файл», которые по сути позволяют злоумышленнику включить произвольный источник и, таким образом, выполнить его на вашем сервере.Взгляни на: http://lwn.net/Articles/203904/
Кроме того, как упоминалось выше, скажите, что вы делаете что-то вроде (значительно упрощенно):
exec("someUnixUtility -f $_GET['arg1']");
Ну, представьте, что злоумышленник это делает, url.come?arg1="blah;rm -rf /", ваш код в основном будет сводиться к следующему:
exec("someUnixUtility -f blah; rm -rf /");
Что в Unix, вы разделяете команды с помощью ;Так что да, это может нанести большой ущерб.
То же самое и с загрузкой файла: представьте, что вы удаляете последние четыре символа (.ext), чтобы найти расширение.А как насчет чего-то вроде этого «exploit.php.gif», тогда вы удаляете расширение, получая эксплойт.php, и перемещаете его в папку /users/imgs/.Что ж, все, что злоумышленнику теперь нужно сделать, это перейти к пользователям/imgs/exploit.php, и он сможет запустить любой код, который захочет.В этот момент вы принадлежали вам.
Другие советы
Использование
exec
или когда вы хотите запустить другую программу.Тот самый документация для passthru говорит:
Предупреждение
Разрешая передачу данных, предоставленных пользователем, в эту функцию, используйте
escapeshellarg()
илиescapeshellcmd()
чтобы гарантировать, что пользователи не смогут обманом заставить систему выполнять произвольные команды.
Вероятно, кто-то обнаружил брешь в безопасности в вашем скрипте, которая позволяла им запускать произвольные команды.Используйте данные функции для очистки ваших входных данных в следующий раз.Помните, что ничто, отправленное от клиента, не может когда - либо будьте уверены.
exec()
позволяет вам использовать скомпилированный код, находящийся на вашем сервере, который будет работать быстрее, чем интерпретируемый PHP.
Итак, если у вас есть большой объем обработки, который нужно выполнить быстро, exec()
может быть полезно.