| |
апустит какую-нибудь разрушительную
утилиту — например, rm -R ~/, которая быстро и "без лишних слов" очистит
весь ваш каталог.
Часть IV. Стандартные функции PHP 278
Как уже упоминалось, выходной поток данных программы направляется в браузер.
Если вы хотите этого избежать, воспользуйтесь функциями popen() или exec().
Если же вы, наоборот, желаете, чтобы выходные данные запущенной программы по-
пали прямиком в браузер и никак при этом не исказились (например, вы вызываете
программу, выводящую в стандартный выходной поток какой-нибудь GIF-рисунок), в
этом случае в самый раз будет функция PassThru().
string exec(string $command [,list& $array] [,int& $return_var])
Функция exec(), как и system(), запускает указанную программу или команду,
однако, в отличие от последней, она ничего не выводит в браузер. Вместо этого
функ-
ция возвращает последнюю строку из выходного потока запущенной программы и,
если задан параметр $array (который обязательно должен быть переменной), то он
заполняется списком строк в выходном потоке — по одной строке на элемент.
Если массив уже содержал какие-то данные перед вызовом exec(), новые
строки просто добавляются в его конец, а не заменяют старое содержимое
массива. Учитывайте это в своих программах, иначе нетрудно получить очень
нетривиальную ошибку.
Как и в функции system(), при задании параметра-переменной $return_var код
возврата запущенного процесса будет помещен в эту переменную. Так что функция
exec() тоже дожидается окончания работы нового процесса и только потом возвра-
щает управление в PHP-программу.
string EscapeShellCmd(string $command)
Помните, мы говорили о том, что нельзя допускать возможности передачи данных из
браузера пользователя (например, из формы) в функции system() и exec()? Если
это все же нужно сделать, то данные должны быть соответствующим способом обра-
ботаны: например, можно защитить все специальные символы обратными слэшами, и
т. д. Это и делает функция EscapeShellCmd(). Чаще всего ее применяют примерно
в таком контексте:
system("cd ".EscapeShellCmd($to_directory));
Здесь переменная $to_directory пришла от пользователя — например, из формы
или Cookies. Давайте посмотрим, как злоумышленник может стереть все данные на
вашем сервере, если вы по каким-то причинам забудете про EscapeShellCmd(),
написав следующий код:
system("cd $to_directory"); // Никогда так не делайте!
Задав такое значение для $to_directory:
~; rm -R *; sendmail [email protected]
|
|