2016-06-10 5 views
-3

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

Позволяет объяснить мою проблему, у меня есть основной файл php, который обрабатывает все страницы, все страницы хранятся в db с кодом и все и выполняется через eval. И система также имеет функцию include_db, которая в основном делает то же самое, что и включить php normaly только из db.

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

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

Заранее спасибо!

Код что в настоящее время evalled на главной странице:

$skill = isset($_REQUEST['skill']) && is_string($_REQUEST['skill']) && isValidSkill($_REQUEST['skill']) ? $_REQUEST['skill'] : 'overall'; 

if(!isset($_REQUEST['player'])) 
    include_db('highscore_overview'); 
else 
    include_db('highscore_player'); 

и внутри включать в обзор я свалка get_defined_vars() и не возвращает $ навыка я поставил перед включать только переменные, которые объявлены в main index.php (база данных и так далее)

+0

Казалось бы, ваша проблема не имеет ничего общего с 'eval', но с переменной областью. Вы должны отправить пример кода, который показывает проблему. – jeroen

+0

Я добавил код, который я использую, с другой информацией – crasyboy42

+0

Возможно, PHP-версия может быть полезной –

ответ

0

Прежде всего отказ от ответственности: вы никогда не должны выполнять код из базы данных. Это большой риск для безопасности. Это означает, что всякий раз, когда кто-то успешно получает доступ к вашей базе данных (например, используя SQL-инъекцию), теперь также можно выполнить произвольный код в php, изменив код в вашей базе данных. Вы действительно не должны этого делать!

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

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

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

<?php 
function include_db() { 

    # ... get $code from db here ... 

    # get's executed after code from db, globalizes all variables 
    $code .= ';foreach (get_defined_vars()) as $newGlobalName) {'; 
    $code .= ' $GLOBALS[$newGlobalName] = $$newGlobalName;'; 
    $code .= '}'; 

    eval($code); 
} 
+0

Что касается проблем с eval, я знаю, но у моей системы есть система, чтобы сделать из db все физические файлы, когда я их «публикую» :) Но в отношении вашего ответа, что get_defined_vars() не содержит vars, которые определены из самого eval. только из физических файлов. Любая идея, как это можно обойти?(например, он не может видеть $ навык, определенный выше функции include_db). – crasyboy42

+0

get_defined_vars() содержит переменные, определенные в eval, если он выполняется внутри eval. –

+0

Если он не был выполнен внутри моей функции include_db yes, он не отображает элементы, которые определены внутри первого eval. Значит, умение не видно изнутри функции include_db, или я делаю что-то неправильно? – crasyboy42

Смежные вопросы