Какие ситуации требуют использования eval (), потому что нет альтернатив? - PullRequest
8 голосов
/ 25 февраля 2010

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

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

Для наглядности:

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

Ответы [ 5 ]

10 голосов
/ 25 февраля 2010

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

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

В Javascript они говорят, что "eval is evil "; в PHP это так же верно, как и в Javascript.


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

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

2 голосов
/ 25 февраля 2010

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

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

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

С

0 голосов
/ 25 февраля 2010

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

0 голосов
/ 25 февраля 2010

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

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

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

(потому что вы не можете просто написать $ className :: methodName ());

0 голосов
/ 25 февраля 2010

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

eval это зло в php тоже.

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

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

Итог:

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

...