Я буду помогать с содержанием блога PHP вместе с другими парнями здесь.
В последнее время Eval, кажется, является горячей темой для обсуждения, особенно в свете недавних эксплойтов vBulletin и прошлых эксплойтов в распространенных приложениях, таких как phpMyAdmin . Eval — это одна из функций в PHP, которая может выполнять произвольный код. Обычно eval используется либо неопытными программистами по разным ошибочным причинам, либо людьми, пытающимися раздвинуть границы PHP. Что вдохновило меня на публикацию этой статьи, так это цитата Расмуса Лердорфа, создателя PHP:
Если eval () является ответом, вы почти наверняка задаете неправильный вопрос.
Возможно, это просто мой аргументативный характер, но когда люди используют эту цитату, я всегда задаюсь вопросом, существуют ли какие-либо общие проблемы, которые можно решить только с помощью eval. Прежде чем я углублюсь в мельчайшие подробности, краткий обзор того, что на самом деле делает eval, из руководства по PHP :
mixed eval ( string code_str ) eval() evaluates the string given in code_str as PHP code. Among other things, this can be useful for storing code in a database text field for later execution.
mixed eval ( string code_str ) eval() evaluates the string given in code_str as PHP code. Among other things, this can be useful for storing code in a database text field for later execution.
Для неопытного программиста это может звучать как фантастическая идея, позволяющая сохранять фрагменты кода в базе данных и выполнять в зависимости от других критериев, хранящихся вместе с записью. На практике, написание приложения, которое интерпретирует фрагменты кода, которые хранятся вместе с пользовательскими данными, вызывает проблемы. Возьмите этот пример, который вызывает функцию и присваивает результат переменной.
function getTemplate($tpl) { return "a template"; }
eval (‘$ content = getTemplate («‘. $ _ GET [‘tpl’]. ‘»);’);
Если Магические Кавычки отключены, это создает огромную дыру в безопасности, поскольку все, что нужно сделать злоумышленнику для выполнения произвольного php-кода, — вставить его в URL-адрес запроса. Например, следующая строка запроса приводит к выводу содержимого текущего каталога на экран.
/eval.php?tpl=%22);+passthru(%22ls+-al
Естественно, этот пример надуман, но он очень похож на код, который был целью недавних атак на PHPBB и VBulletin. Этот вид кода обычно является результатом ленивого программирования или плохого дизайна. Некоторые более продвинутые варианты использования Eval менее опасны и более интересны, например:
- Создание MockObjects в SimpleTest
- Определение PHP4-совместимой функции clone ()
- Передача переменного количества параметров по ссылке на функцию
Пожалуйста, не стесняйтесь оставлять отзывы или примеры хорошего или плохого использования eval.