2010-02-25 3 views
8

Я знаю, что eval следует избегать в JavaScript по соображениям скорости и безопасности. Но в случае PHP редко упоминается безопасность. Чаще всего ваша программа работает медленнее, чем должна из-за случайного использования eval.Какие ситуации требуют использования eval(), потому что альтернатив нет?

В каких конкретных ситуациях вы должны использовать eval, потому что нет другого пути вокруг него?

Для ясности:

Мы не говорим о введенных пользователем данных. Поэтому вопрос сосредоточен на чистом и полностью контролируемом использовании на стороне сервера eval.

ответ

0

я знаю Eval следует избегать JavaScript для скорости и безопасности причин. но в случае с php редко упоминается безопасность. чаще всего ваша программа работает медленнее, чем нужно из-за случайное использование eval.

eval является evil в PHP тоже.

в каких конкретных ситуациях должны вы использование Eval(), потому что нет никакого другого пути вокруг него?

Прежде всего, мы стараемся избежать его как можно больше, но если вы должны использовать, что для выполнения некоторого кода, то вам придется идти с этим, но, как сказал, что это зло, вы используете свой собственный риск.

Bottom Line:

Никогда не позволяют в любом случае, вводимые пользователем, чтобы запустить с eval. (Если вы не знаете, что вы делаете/рискуете)

+0

ОП не говорил, что это было с предоставленными пользователем данными, в основе которых лежит его (очень краткий) аргумент. Он спросил, существуют ли какие-либо правильные ситуации для его использования. Ясно, что использование 'eval' на поставляемом пользователем ata недействительно, но на самом деле это не отвечает на вопрос. –

+0

@ Crowder: он сказал: «Я знаю, что eval следует избегать в javascript для скорости и соображений безопасности, но в случае php редко упоминается безопасность.» Предполагая, что в php не упоминается зло. :) Я также обсуждал ситуацию/часть использования. Спасибо – Sarfraz

10

Проблемы с безопасностью eval -общий код с eval на PHP такой же, как в Javascript: если вы оцениваете код, вы должны быть уверены, где это исходит из того, что он содержит.

Последствия для безопасности могут быть даже больше, поскольку PHP имеет доступ к вашей базе данных (между прочим) - это означает, что он может использоваться для кражи или коррумпирования почти любых сведений, на которые опирается ваше приложение!

В Javascript говорят, что «eval is evil»; это, вероятно, так же верно в PHP, что это правда в Javascript.


Теперь о конкретных ситуациях, в которых вы не можете избежать использования eval ...Ну, что-то вроде 4-х лет развития PHP в качестве моей повседневной работы, я не помню, чтобы когда-либо использовал eval в своем собственном коде. ^^

Тем не менее, и примером ситуации, в которой вам нужно eval, было бы, когда например, вы храните некоторый код в базе данных, а не кешируете его в файлах (которые могут быть включены) - это происходит с некоторыми CMS, которые позволяют, например, вводить части кода PHP в разделе администрирования.

+0

Полностью согласен. Я был бы более осторожен с PHP eval, чем js eval, и я не могу вспомнить один экземпляр, где мне это нужно. –

+4

+1 Я бы сказал, что в PHP ** явно больше зла, чем в JavaScript из-за диска, базы данных и произвольного доступа к сети. –

0

Я полностью согласен с предыдущими ответами в том смысле, что eval - это зло, и я никогда не использую его в своем коде.

но в одной ситуации мне не удалось избежать eval. У меня мало опыта работы в php, поэтому я буду рад, если кто-нибудь сообщит мне, как я могу переписать код без «eval». в этой ситуации у меня было имя класса, хранящееся в переменной, и мне пришлось вызвать статический метод в этом классе, имя класса - из надежного источника. так что я должен был написать что-то вроде этого:

eval("\$result = $className::methodName()"); 

(потому что вы не можете просто написать $ Classname :: имяМетода());

+0

'call_user_func (array ($ className, 'methodName'))' или 'call_user_func (" $ className :: methodName ")', в зависимости от вашей версии PHP. – Matthew

+0

call_user_func (массив ($ className, $ methodName)); должно сработать. EDIT: konforce попал передо мной :) – Jimmeh

+0

есть та же проблема с безопасностью, но производительность лучше ... не знаю, почему я не думал об использовании этого) – kipelovets

0

Если вы хотите использовать анонимные функции до PHP 5.3, вам необходимо использовать create_function, который обертывает вызов eval().

2

Eval and create_function may Позволяет вводить аббревиатуру. На PHP есть много вещей, которые могут быть использованы для нарушения безопасности вашего приложения.

Мы говорим детям, чтобы они не играли ножами и спичками - но это полезно (если не важно) при правильном использовании. Таким образом, это связано с множеством функциональных возможностей PHP. Нет ничего по-настоящему неправильного в использовании функциональности , если вы точно понимаете, что вы делаете.

Но обсуждение языков программирования на таком абстрактном уровне - это не то, о чем говорит StackOverflow.

C.