2008-09-03 2 views
28

Я пытаюсь написать страницу, которая вызывает PHP, который хранится в базе данных MySQL. Страница, которая хранится в базе данных MySQL, содержит код PHP (и HTML), который я хочу запустить при загрузке страницы.Как выполнить PHP, который хранится в базе данных MySQL?

Как я мог это сделать?

+8

Спасибо за этот вопрос. Вопреки многим «ответам» ниже, это хороший и полезный. Существует много применений LEGIT, где вы хотите хранить команды PHP в БД. Говорить «не делай этого», не зная обстоятельств, просто надменно. – 2013-03-27 02:34:03

ответ

30

Для этого вам может понадобиться команда eval. Я бы порекомендовал против этого, потому что есть много подводных камней, использующих этот подход. Отладка жесткая (er), она подразумевает некоторые риски безопасности (плохой контент в БД выполняется, о, о).

См., Например, When is eval evil in php?. Google для Eval - это зло, и вы найдете много примеров, почему вы должны найти другое решение.

Дополнение: Еще одна хорошая статья с некоторыми ссылками на эксплойты - this blogpost. Относится к прошлым vBulletin и эксплойтам phpMyAdmin, которые были вызваны неправильным использованием Eval.

+0

выдержка из «Eval is evil»: «Разрешить любые данные, предоставленные пользователем для вызова eval(), требуется взломать». - Хорошо, что, если я использую свой собственный код, хранящийся в БД и используемый, например. для динамичной и быстрой генерации пользовательских форм? – Jeffz 2013-05-10 14:38:00

+0

@Jeffz, вам лучше быть уверенным, что в этом случае нет плохого кода. Кроме того, зачем вы вставляете его в базу данных, а не только в несколько файлов кода? – 2013-05-10 16:36:42

+0

оба способа хороши, если вы знаете, что делаете; [А]. файл на основе более безопасен (особенно для довольно нового для кодирования), [B]. db way более универсален, если некоторые изменения в коде в полете необходимы, поскольку обновление db проще, чем обновление, настройка (независимо) содержимого файла – Jeffz 2013-07-07 13:18:01

2

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

5

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

1

Рассматривали ли вы использование вашей системы управления версиями для хранения различных вилок для различных установок (и модулей, которые отличаются от них)? Это будет одна из нескольких лучших практик для конфигурации приложения, о которой я могу думать. У вас нет необычного требования, так что это проблема, которая была решена другими в прошлом; и сохранение кода в базе данных - это то, о чем я думаю, вам нелегко найти ссылку или посоветоваться как лучшая практика.

Хорошо, что вы опубликовали разъяснение. Вероятно, вы случайно случайно поставили ответ в поисках подходящего вопроса.

22

Easy:

$x // your variable with the data from the DB 
<?php echo eval("?>".$x."<?") ?> 

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

0

Как я сделал это, чтобы иметь поле в базе данных, которое идентифицировало что-то уникальное в блоке кода, который необходимо выполнить. Это одно слово находится в имени файла этого кода. Я помещаю строки вместе, чтобы указать на файл php, который будет включен. Пример:

$lookFor = $row['page']; 

include("resources/" . $lookFor . "Codebase.php"); 

Таким образом, даже если хакер может получить доступ к вам DB он не может поставить вредоносный код прямо туда, чтобы быть выполнены. Возможно, он мог бы изменить ссылочное слово, но если бы он не мог разместить файл прямо на сервере, это не принесло бы ему пользы. Если бы он мог помещать файлы прямо на сервер, вы все равно потопнули, если он действительно хочет быть противным. Только мои два цента стоят.

И да, есть причины, по которым вы хотите выполнить сохраненный код, но есть минусы.

0

Прочитайте код php из базы данных и сохраните файл с уникальным именем, а затем включите файл этот простой способ для запуска php-кода и его отладки.

$uniqid="tmp/".date("d-m-Y h-i-s").'_'.$Title."_".uniqid().".php";  
$file = fopen($uniqid,"w"); 
fwrite($file,"<?php \r\n ".$R['Body']); 
fclose($file);       
// eval($R['Body']); 
include $uniqid; 
Смежные вопросы