Самое опасное в PHP или "eval is evil"
На мой взгляд, самое опасное в PHP - не подверженность SQL-инъекциям, XSS-атакам и неправильной обработке пользовательских данных.
Самое опасное - это программисты на PHP :) Точней, те из них, кто поверхностно усвоив синтаксис языка, начнают клепать на нём сайты.
Смешно, но на вполне коммерческом проекте мне недавно попался PHP-скрипт, разрешающий... выполнять пользователю сервера любой PHP-код на нём! Реализация - естественно, через функцию eval
, которой параметром передаётся введённый в форму HTML код. Админ с минимальным опытом работы проснулся бы в холодном поту от одной мысли о таком, а тут на проекте преспокойно болтается примерно следующее:
$text=$_POST['text']; //На самом деле, был минимум обработки данных POST //... ob_start(); eval ($text); $out1 = ob_get_contents(); ob_end_clean(); echo "$out1";
Ещё смешнее другое - по словам владельцев ресурса, у них "никто ничего взломать не пытался". Несмотря на приличную посещаемость. Наводит на мысли, правда? Мелкий пошёл юзер, не тот...
Только после демонстрации кода вроде
$s=file_get_contents ("../ИМЯ_ПАПКИ/config.php"); echo htmlspecialchars($s);
получившего файл конфигурации "движка" сервера со всеми логинами, настройками, именем базы данных и логином/паролем к ней и т.п. (файл получен переходом в родительскую папку ..
, затем в папку "движка", её имя показано как ИМЯ_ПАПКИ
), "программисты" признали проблему существующей и "решили" её, понаставив проверок и запретов, а в итоге, "разрешив пользователям выполнять только арифметические действия и echo
". Так как объяснить, что и это - не решение, было выше моих сил, пришлось повторить "взлом":
$a = 'file_get_contents'; echo htmlspecialchars(${'a'}('../ИМЯ_ПАПКИ/config.php'));
После этого сервис "закрыт на доработку". Меж тем, "доработка" может быть только одна - не применять функцию eval
ни к каким пользовательским данным вообще. Eval is evil.
Впрочем, если хочется, вот подобный сервис в исходниках, написан он примерно за час, позволяет выполнять код PHP в системе, выводит номер строки с ошибкой, и даже показывает номера строк в процессе редактирования (Из-за отсутствия свойств selectionStart
(selectionEnd
) браузеры Internet Explorer не покажут номер текущей строки в программе):
скриншот сервиса Eval PHP
Скачать исходник - на странице статьи
27.03.2011, 14:22 [20270 просмотров]