Официальная документация относительно функции eval()
как функции, говорит:
Помимо всего прочего, это может быть полезно для хранения кода в текстовом поле базы данных для последующего выполнения.
Я серьезно смущен этим. Является ли PHP-документация предлагать хранить строки PHP в базах данных? Какие? Разве это не так опасно?
Что делать, если я знаю, что в базе данных есть строка, которая выполняется как PHP? Разве это не очень опасно? Я просто нуждаюсь в инъекции Sql, чтобы делать то, что хочу на этом сайте, независимо от того, что хочу . Я могу удалить всю базу данных, я могу получить все из скрипта, я могу сделать все.
Как это может быть так полезно?
Не могли бы вы привести несколько примеров того, как этот eval()
может быть полезен? Кроме того, я, вероятно, что-то пропустил, почему я видел некоторые коды вроде:
eval("if (is_int($int)) { return false }");
а не просто
if (is_int($int)) { return false }
Но, как я уже сказал, я, вероятно, что-то пропустил: что?
Функция eval()
фантастическая! Люди используют его все время, чтобы вводить код и получать отличный доступ к серверам все время. Вы часто увидите использование функции eval()
и этой регулярной выражения, которая также выполняется, в частности, в сломанных установках WordPress.
Есть очень мало причин, по которым вам понадобится eval. Например, если я создавал сайт тестирования PHP, где люди могли вводить некоторый код на странице, а затем запускать его. Разумеется, сначала его нужно будет дезинфицировать, по тем причинам, которые вы указали.
Допустим, у вас была CMS, которая позволяла вам вводить PHP-код. Я могу увидеть использование функции eval
для оценки этого фрагмента PHP. Javascript также имеет eval по той же причине.
Все причины в сторону, eval очень опасен. Я согласен, что его никогда не следует использовать.
Да, это может быть очень опасно. Одно место, которое я видел, это система, которая позволяла очень сложную конфигурацию экрана поиска и позволяла пользователям сохранять поисковые конфиги. Детали поиска были сохранены как фактический код, который был выполнен как eval. Входы хранились отдельно и были проверены (в некоторой степени, я не знаю деталей), чтобы предотвратить внедрение SQL. Это единственный раз, когда я видел это, и это, вероятно, не было необходимым (хотя я никогда не видел достаточной информации об этой системе, чтобы точно знать).
eval()
потенциально полезен, когда вы не знаете, какой код нужно выполнить до выполнения (например, пример, который я привел выше), но эти случаи не являются тем случаем, который случается каждый день для большинства разработчиков. Если вы когда-нибудь столкнетесь с ситуацией, когда вам нужен eval()
, просто попробуйте убедиться, что вы никогда не передаете ее напрямую от пользователя. Еще лучше, если вы сможете найти способ ограничить (до некоторой степени) код, который будет передан ему, но это будет зависеть от проблемы.
Не могли бы вы привести несколько примеров того, как этот метод eval () может быть полезен?
Например, он используется шаблонами. Они анализируют и компилируют шаблоны для PHP-кода и могут либо хранить код в любом месте, либо выполнять его непосредственно с помощью eval()
.
Помимо этого, это опасная функция.
Ну, это действительно небезопасно, вы все равно должны санировать свой код.
Однако он не предназначен для оценки выражений, вводимых пользователями или любыми другими средствами, например, из БД.
Я нашел это полезным, когда язык не обеспечивает метапрограммирование. Так, например, вам нужно заполнить bean-компонент из 50 полей, которые называются одинаковыми, но с небольшой разницей в имени метода, таком как число (предположим, что у него есть поле1 (), field2 (), field3 () … и т. Д.). , то вы можете использовать eval внутри a for: построить имя метода в виде строки, а затем вызвать его.
Таким образом, вы можете преобразовать 100 повторяющихся строк кода в 5, еще пару, если вы хотите добавить документацию о том, как это работает. Это небезопасно, потому что никто здесь не трогает ваш код.
У вас может быть что-то вроде
$text = 'This is some random number: $number. Hello world!'; ... $number = 15; ... eval ("\$replacedText = \"$text\";");
В тексте eval $ будет заменено на «Это случайное число: $ number. Hello world!», А eval гарантирует, что число $ number также будет заменено на 15