Eval (), какой смысл? - PullRequest
       44

Eval (), какой смысл?

6 голосов
/ 25 января 2011

Официальная документация, касающаяся eval() как функции, гласит:

Среди прочего, это может быть полезно для хранения кода в текстовом поле базы данных для последующего выполнения.

Я серьезно смущен этим.Предлагает ли документация PHP хранить строки PHP в базах данных?Какие?Разве это не чертовски небезопасно?

Что если я знаю, что в базе данных есть строка, которая выполняется как PHP?Разве это не опасно?Мне просто нужна инъекция Sql, чтобы делать все, что я хочу на этом сайте, , что я хочу .Я могу удалить всю базу данных, я могу получить все из сценария, я могу сделать все.

Как это может быть так полезно?

Не могли бы вы дать мне несколько примеров того, как этот eval() может быть полезным?Кроме того, я, вероятно, что-то упускаю, почему я видел некоторые коды вроде:

eval("if (is_int($int)) { return false }");

вместо просто

if (is_int($int)) { return false }

Но, как я уже сказал, я, вероятно, что-то упускаю:

Ответы [ 6 ]

7 голосов
/ 25 января 2011

Фантастическая функция eval()!Люди постоянно используют его для внедрения кода и все время получают отличный доступ к серверам.Вы часто будете видеть использование eval() и той функции регулярного выражения, которая также выполняется, среди прочего, в сломанных установках WordPress.

Существует очень мало причин, по которым вам понадобится eval.Например, если бы я делал сайт для тестирования PHP, где люди могли бы ввести некоторый код на страницу и затем запустить его.Конечно, в первую очередь его необходимо продезинфицировать по тем причинам, которые вы перечислили.

4 голосов
/ 25 января 2011

Допустим, у вас есть CMS, которая позволяет вам вводить код PHP. Я вижу использование функции eval для оценки этого фрагмента PHP. Javascript также имеет eval по той же причине.

Со всеми причинами, eval очень небезопасен. Я согласен, что это никогда не должно использоваться.

3 голосов
/ 25 января 2011

Да, это может быть очень опасно. В одном месте, которое я видел, использовалась система, которая позволяла очень сложную конфигурацию экрана поиска и позволяла пользователям сохранять настройки поиска. Детали поиска были сохранены как фактический код, который был выполнен как eval. входные данные хранились отдельно и проверялись (до некоторой степени, я не знаю деталей), чтобы предотвратить внедрение SQL. Это единственный раз, когда я видел это, и, вероятно, в этом не было необходимости (хотя я никогда не видел достаточно этой системы, чтобы знать наверняка).

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

2 голосов
/ 25 января 2011

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

Используется, например, шаблонизаторами. Они анализируют и компилируют шаблоны в код PHP и могут сохранять код в любом месте или выполнять его непосредственно с помощью eval().

Кроме этого, это опасная функция.

1 голос
/ 25 января 2011

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

Однако он не предназначен для оценки выражений, введенных пользователями или любыми другими средствами, такими как из БД.

Я нашел это полезным, когда язык не обеспечивает метапрограммирование. Так, например, вам нужно заполнить бин 50 полями, которые называются одинаковыми, но с небольшим отличием в имени метода, например, числом (представьте, что у него есть field1 (), field2 (), field3 () ... etc) , затем вы можете использовать eval внутри for: создать имя метода в виде строки и затем вызвать его.

Таким образом, вы можете преобразовать 100 повторяющихся строк кода в 5, еще пару, если вы хотите добавить документацию о том, как это работает. Это небезопасно, потому что никто не трогает ваш код здесь.

0 голосов
/ 25 января 2011

Вы можете иметь что-то вроде

$text = 'This is some random number: $number. Hello world!';
...
$number = 15;
...
eval ("\$replacedText = \"$text\";");

В eval $ текст будет заменен на «Это случайное число: $ number. Hello world!», И eval гарантирует, что $ number также будет заменено на 15

...