БлогNot. Самое опасное в PHP или "eval is evil"

Самое опасное в 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
скриншот сервиса Eval PHP

 Скачать исходник - на странице статьи

27.03.2011, 14:22 [20175 просмотров]


теги: программирование php безопасность взлом

К этой статье пока нет комментариев, Ваш будет первым