• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Исполнение Php кода из базы данных

  • Автор темы TT.
  • Дата начала
T

TT.

Надо прогнать через php интерпретатор код, который хранится в базе данных. Это блоки на странице, которые можно настраивать в web интерфейсе.


Решение №1. Предварительно записать код в файл, а сам файл присоединить. (подходит если блоки часто меняют содержание)

Решение №2. Создать библиотеку файлов, имена которых равны (текущее URL, почищенный от символов которые нельзя использовать в название файлов), и присоединять файлы из этой библиотеки. (не надо тратить время на создание файлов)

Решение №3. Создать таблицу для связи (ID блока + текущий URL) с уникальным именем файла.




Может я зря заморачиваюсь, и есть более простое решение?
 
G

GOsha

Используй функцию eval();

eval
(unknown)

eval - вычисляет строку как PHP-код.

Описание
mixed eval (string code_str)

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

При использовании eval() необходимо помнить о нескольких вещах. Запомните, что передаваемая строка обязана быть правильным кодом PHP, включая окончание операторов точкой с запятой, чтобы разборщик не отвалил на строке после eval(), и правильное escap-ируйте в code_str.

Также помните, что значения, заданные переменным в eval(), останутся действовать затем и в основном скрипте.

Оператор return завершит вычисление строки немедленно. В PHP 4 eval() возвращает FALSE, если не вызвана return() в вычисляемом коде, и в этом случае возвращается значение, передаваемое в return(). В PHP 3 eval() не возвращает значения.

Пример 1. eval() - простое объединение текста
Код:
<?php
$string = 'cup';
$name = 'coffee';
$str = 'This is a $string with my $name in it.<br>';
echo $str;
eval ("\$str = \"$str\";");
echo $str;
?>

Этот пример выведет:
This is a $string with my $name in it.
This is a cup with my coffee in it.

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

Plantis

У меня вот такое код
PHP:
print"Under construction<br>start<br>";
eval ("\$content = \"$content\";");

print "$content";
print "<br>finish";
Выдаёт
Код:
Under construction
start
print ""; $conn = mysql_connect("$serverdb","$logindb","$passdb"); mysql_select_db("$namedb",$conn); $sql = "SET NAMES 'cp1251'"; mysql_query($sql,$conn); mysql_select_db("$namedb",$conn);	 if ( $show == "1") main_menu("21","?????",ru,no,"1"); If ($show == "0" OR $show == "") { for ($i = 1; $i <= 40; $i++) { $sql = " SELECT * FROM page WHERE id ='$i'"; $result = mysql_query($sql,$conn); $row = mysql_fetch_assoc($result); $id = $row["id"]; $type = $row["type"]; $lang = "ru"; $name = $row["ru_name"]; $show = "1"; if ($type == "articles") { article_list($id,$name,$lang,$category,"0"); }; }; }; print"
"; 
finish

Что делать?

Добавлено: Да и еще...
У меня на домашнем сервере работает. А на сайте нет. Я писал хостингу - сказали, что функция евал() работает у них нормально.
 
T

TT.

У меня вот такое код
PHP:
print"Under construction<br>start<br>";
eval ("\$content = \"$content\";");

print "$content";
print "<br>finish";
Выдаёт
Код:
Under construction
start
print ""; $conn = mysql_connect("$serverdb","$logindb","$passdb"); mysql_select_db("$namedb",$conn); $sql = "SET NAMES 'cp1251'"; mysql_query($sql,$conn); mysql_select_db("$namedb",$conn);	 if ( $show == "1") main_menu("21","?????",ru,no,"1"); If ($show == "0" OR $show == "") { for ($i = 1; $i <= 40; $i++) { $sql = " SELECT * FROM page WHERE id ='$i'"; $result = mysql_query($sql,$conn); $row = mysql_fetch_assoc($result); $id = $row["id"]; $type = $row["type"]; $lang = "ru"; $name = $row["ru_name"]; $show = "1"; if ($type == "articles") { article_list($id,$name,$lang,$category,"0"); }; }; }; print"
"; 
finish

Что делать?

Добавлено: Да и еще...
У меня на домашнем сервере работает. А на сайте нет. Я писал хостингу - сказали, что функция евал() работает у них нормально.


1. Зачем это нужно? Может можно это сделать проще.

2. Что дает этот код?
echo '-------------------------';
var_export($content);
echo '-------------------------';
eval ('$content = "' . $content . '";');
var_export($content);
echo '-------------------------';
 
P

Plantis

Дело в том, что переменная $content - берется из базы данных. В базе данных храниться ПХП код, который надо выполнить
 
T

TT.

Дело в том, что переменная $content - берется из базы данных. В базе данных храниться ПХП код, который надо выполнить


У меня один раз была проблема:
При назначении переменной значения, нельзя эту переменную использовать. Точно не помню в каком это было случае или с объектами, или со статическими свойставми или с переменными, ну вылечилось это установкой более свещей версии PHP.

var = var + 'string'; - не работало в какой то версии PHP

может быть тут:
eval ("\$content = \"$content\";");
та же проблема, если на одном сервере работает, а на другом нет.


Что дал код из второго пункта?
 
P

Plantis

Без изменении.

Код:
-------------------------'print ""; $conn = mysql_connect("$serverdb","$logindb","$passdb"); mysql_select_db("$namedb",$conn); $sql = "SET NAMES \'cp1251\'"; mysql_query($sql,$conn); mysql_select_db("$namedb",$conn);	 if ( $show == "1") main_menu("21","?????",ru,no,"1"); If ($show == "0" OR $show == "") { for ($i = 1; $i <= 40; $i++) { $sql = " SELECT * FROM page WHERE id =\'$i\'"; $result = mysql_query($sql,$conn); $row = mysql_fetch_assoc($result); $id = $row["id"]; $type = $row["type"]; $lang = "ru"; $name = $row["ru_name"]; $show = "1"; if ($type == "articles") { article_list($id,$name,$lang,$category,"0"); }; }; }; print"
"; '-------------------------'print ""; $conn = mysql_connect("$serverdb","$logindb","$passdb"); mysql_select_db("$namedb",$conn); $sql = "SET NAMES \'cp1251\'"; mysql_query($sql,$conn); mysql_select_db("$namedb",$conn);	 if ( $show == "1") main_menu("21","?????",ru,no,"1"); If ($show == "0" OR $show == "") { for ($i = 1; $i <= 40; $i++) { $sql = " SELECT * FROM page WHERE id =\'$i\'"; $result = mysql_query($sql,$conn); $row = mysql_fetch_assoc($result); $id = $row["id"]; $type = $row["type"]; $lang = "ru"; $name = $row["ru_name"]; $show = "1"; if ($type == "articles") { article_list($id,$name,$lang,$category,"0"); }; }; }; print"
"; '-------------------------

На домашнем серваке код из второго пункта не работает.
 
T

TT.

Без изменении.

Код:
-------------------------'print ""; $conn = mysql_connect("$serverdb","$logindb","$passdb"); mysql_select_db("$namedb",$conn); $sql = "SET NAMES \'cp1251\'"; mysql_query($sql,$conn); mysql_select_db("$namedb",$conn);	 if ( $show == "1") main_menu("21","?????",ru,no,"1"); If ($show == "0" OR $show == "") { for ($i = 1; $i <= 40; $i++) { $sql = " SELECT * FROM page WHERE id =\'$i\'"; $result = mysql_query($sql,$conn); $row = mysql_fetch_assoc($result); $id = $row["id"]; $type = $row["type"]; $lang = "ru"; $name = $row["ru_name"]; $show = "1"; if ($type == "articles") { article_list($id,$name,$lang,$category,"0"); }; }; }; print"
"; '-------------------------'print ""; $conn = mysql_connect("$serverdb","$logindb","$passdb"); mysql_select_db("$namedb",$conn); $sql = "SET NAMES \'cp1251\'"; mysql_query($sql,$conn); mysql_select_db("$namedb",$conn);	 if ( $show == "1") main_menu("21","?????",ru,no,"1"); If ($show == "0" OR $show == "") { for ($i = 1; $i <= 40; $i++) { $sql = " SELECT * FROM page WHERE id =\'$i\'"; $result = mysql_query($sql,$conn); $row = mysql_fetch_assoc($result); $id = $row["id"]; $type = $row["type"]; $lang = "ru"; $name = $row["ru_name"]; $show = "1"; if ($type == "articles") { article_list($id,$name,$lang,$category,"0"); }; }; }; print"
"; '-------------------------

На домашнем серваке код из второго пункта не работает.


А зачем, полученная из базы данных строка записывается в переменную $content?


Код:
print ""; 
$conn = mysql_connect("$serverdb","$logindb","$passdb"); 
mysql_select_db("$namedb",$conn); 
$sql = "SET NAMES \'cp1251\'"; 
mysql_query($sql,$conn); 
mysql_select_db("$namedb",$conn);	 
if ( $show == "1") main_menu("21","?????",ru,no,"1"); 
If ($show == "0" OR $show == "") { 
for ($i = 1; $i <= 40; $i++) { 
$sql = " SELECT * FROM page WHERE id =\'$i\'"; 
$result = mysql_query($sql,$conn); 
$row = mysql_fetch_assoc($result); 
$id = $row["id"]; $type = $row["type"]; 
$lang = "ru"; 
$name = $row["ru_name"]; 
$show = "1"; 
if ($type == "articles") { 
article_list($id,$name,$lang,$category,"0"); 
}; 
}; 
}; 
print"
";

Для того что бы этот код выполнился попробуйте:

eval($content);
 
P

Plantis

Код, который сейчас вы вывели, храниться в базе данных - это и есть содержание переменной $content. Я вызываю страницу, в которой находится код для вывода на страницу списка из базы данных.


А... вроде понял. сейчас попробую. в переменной "контент" - нету текста...

Добавлено: Спасибо, разобрался. Работает... теперь другой таракан вылез
 
V

vital

бтв Ой не хорошо такие штуки делать.. Лучше код выполнять и в базу вставлять результат. Ибо eval()=95% крутая дыра в безопасности.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!