Intereting Posts

Что я могу использовать вместо eval ()?

У меня есть строка, в которой хранятся некоторые переменные, которые должны быть выполнены для получения результата, например:

define('RUN_THIS', '\$something.",".$somethingElse'); 

Который затем eval() -uated:

 $foo = eval("return ".RUN_THIS.";"); 

Я понимаю, что eval небезопасно, если строка, которая оценивается, вводится пользователем. Однако, если, например, я хотел, чтобы все сработало с HipHop от Facebook, который не поддерживает eval (), я не мог этого сделать.

Очевидно, я могу использовать call_user_func() – это фактически тот же результат, что и eval() ? Как считается безопасным, когда eval() не является, если это действительно так?

Изменить: В ответ на комментарии я не изначально дал понять, в чем цель. Константа определяется заранее, чтобы более поздний код, будь то внутри класса, который имеет доступ к конфигурационным константам или процедурный код, может использовать его для оценки данной строки переменных. Переменные, которые нужно оценивать, могут варьироваться (в разных случаях, в разных именах, порядке, форматировании), но они выполняются с той же целью одинаково, поэтому в настоящее время у меня есть строка переменных, установленных в константе в этом путь. Технически, eval() небезопасно, если только config.php, определяющий константы, контролируется, но это не вопрос.

У Кендалла, похоже, есть простое решение , но я постараюсь ответить на ваш другой вопрос:

Очевидно, я могу использовать call_user_func () – это фактически тот же результат, что и eval ()? Как считается безопасным, когда eval () не является, если это действительно так?

call_user_func на самом деле безопаснее, чем eval из-за того, что call_user_func может вызывать только одну пользовательскую функцию. eval другой стороны, eval выполняет строку как сам PHP-код. Вы можете добавить '; (закройте строку и запустите новую «строку» кода) в конце строки, а затем добавьте еще какой-нибудь код, добавьте ;' (завершите строку кода и запустите другую строку, чтобы не было синтаксической ошибки), что позволяет постоянному RUN_THIS содержать много PHP-кода, который пользователь может запускать на сервере (включая удаление всех важных файлов и получение информации для баз данных и т. д. НИКОГДА НЕ ПОЗВОЛЯЙТЕ ЭТО ПРОИСХОДИТЬ.

call_user_func не позволяет его произойти. Когда вы запускаете call_user_func_array($func, $args) пользователь может запускать только ограниченный набор функций, потому что: (a) функция должна быть определена пользователем (b) вы можете манипулировать $func чтобы гарантировать, что пользователь не может выполните любую функцию, которую он / она хочет либо, проверив, что $func находится в списке «разрешенных функций», либо путем префикса чего-то вроде user_ для имен функций и самой переменной $func (таким образом, пользователь может запускать только функции, начинающиеся с user_ ,

Я не вижу причин, по которым вы не можете просто использовать построение строк с двойной кавычкой.

 $foo = "\$something,$somethingElse";