Вообщем пытаюсь написать скрипт сохранения PHP кода в БД и натыкаюсь на следующую проблему. Передаю из textarea следующий код Код (Text): function FormAddCreate($table) { $result = ''; $SQL = 'DESCRIBE '.$table; $Query = mysql_query($SQL); $result .= '<form action="/core/index.php"><table width="100%">'; $result .= $this->get_input_hidden('action','value="add"'); $result .= $this->get_input_hidden('table','value="'.$table.'"'); while ($row = mysql_fetch_array($Query)) { $result .= '<tr>'; if ($row['Field'] <> 'id') { if ($row['Type'] == 'text') { $result .= '<td>'.$row['Field'].'</td><td>'.$this->get_input_text($row['Field']).'</td>'; } else if ($row['Type'] == 'longtext') { $result .='<td>'.$row['Field'].'</td><td>'.$this->get_textarea($row['Field'],"rows=15 style='width:100%;'").'</td>'; } else { $result .= '<td>'.$row['Field'].'</td><td>'.$this->get_input_text($row['Field']).'</td>'; } } $result .= '</tr>'; } $result .= '</table></form>'; return $result; } Затем в файле обработчике обрабатываю весь POST массив Код (Text): foreach ($_POST as $key => $value) { $post .= '$V_'.$key.' = "'.trim(mysql_real_escape_string($value)).'";'; $_POST[$key] = trim($value); } Затем выполняю все то что занес в $post через eval Код (Text): if (isset($post)) {eval ($post);} Но eval не может обработать ту функцию что передал через textarea. Скажите пожалуйста что я делаю не правильно?
и при этом он обязательно на что-то ругается и что-то говорит. Текст ошибки в студию Добавлено спустя 54 секунды: надеюсь, вы защитили ваши поля ввода, знаете что такое CSRF. Как и то, что отправить POST-запрос на указанный адрес может любое быдло, не заходя на сайт и не логинясь в админку. А то сами себе шелл залили, считай.
Ой извиняюсь) Код (Text): Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /home/m/mais3/mais3.bget.ru/public_html/core/index.php(27) : eval()'d code on line 1 Спасибо. Почитаю по этому поводу.
Код (Text): $V_action = "add"; $V_table = "Cardinal_Classes_Functions"; $V_Function_ID = ""; $V_classes_ID = "2"; $V_Name = "FormAddCreate"; $V_PhpScrypt = "function FormAddCreate($table)\r\n{\r\n $result = \'\';\r\n $SQL = \'DESCRIBE \'.$table;\r\n $Query = mysql_query($SQL);\r\n $result .= \' \';\r\n $result .= $this->get_input_hidden(\'action\',\'value=\"add\"\');\r\n $result .= $this->get_input_hidden(\'table\',\'value=\"\'.$table.\'\"\');\r\n while ($row = mysql_fetch_array($Query))\r\n {\r\n $result .= \'\';\r\n if ($row[\'Field\'] <> \'id\')\r\n {\r\n if ($row[\'Type\'] == \'text\')\r\n {\r\n $result .= \'\';\r\n }\r\n else if ($row[\'Type\'] == \'longtext\')\r\n {\r\n $result .=\'\';\r\n }\r\n else\r\n {\r\n $result .= \'\';\r\n }\r\n }\r\n $result .= \'\'; \r\n }\r\n $result .= \' \'.$row[\'Field\'].\' \'.$this->get_input_text($row[\'Field\']).\' \'.$row[\'Field\'].\' \'.$this->get_textarea($row[\'Field\'],\"rows=15 style=\'width:100%;\'\").\' \'.$row[\'Field\'].\' \'.$this->get_input_text($row[\'Field\']).\' \';\r\n return $result;\r\n}"; $V_send = "Добавить";
Мне почему то так показалось удобно в самом начале. Убрал не помогло. Подсказали что ругается на квадртатные скобки, но после того как их проэкранировал обратным сешем получил новую ошибку. Код (Text): Notice: Undefined variable: table in /home/m/mais3/mais3.bget.ru/public_html/core/index.php(24) : eval()'d code on line 1 Notice: Undefined variable: result in /home/m/mais3/mais3.bget.ru/public_html/core/index.php(24) : eval()'d code on line 1 Notice: Undefined variable: SQL in /home/m/mais3/mais3.bget.ru/public_html/core/index.php(24) : eval()'d code on line 1 Notice: Undefined variable: table in /home/m/mais3/mais3.bget.ru/public_html/core/index.php(24) : eval()'d code on line 1 Notice: Undefined variable: Query in /home/m/mais3/mais3.bget.ru/public_html/core/index.php(24) : eval()'d code on line 1 Notice: Undefined variable: SQL in /home/m/mais3/mais3.bget.ru/public_html/core/index.php(24) : eval()'d code on line 1 Notice: Undefined variable: result in /home/m/mais3/mais3.bget.ru/public_html/core/index.php(24) : eval()'d code on line 1 Notice: Undefined variable: result in /home/m/mais3/mais3.bget.ru/public_html/core/index.php(24) : eval()'d code on line 1 Fatal error: Using $this when not in object context in /home/m/mais3/mais3.bget.ru/public_html/core/index.php(24) : eval()'d code on line 1
Откажитесь вообще от eval-а, мой вам совет. Лучше сделайте для себя API строгий, который будет работать на нормальных гет\постах. А то горя еще хлебнете не раз.
Конечно для таких задач, лучше всего использовать HTTP запросы. Тем - более вы же отправляете из форм, а значит лучше сделать поля для каждого действия и подставить их в скрипте. А eval пригождается для реализаций, когда у вас динамика идет в самом скрипте, а не от пользователя. Не рекомендую так вот просто взять и отправленные скрипты запускать через eval.
Ну я так и сделал. И проблемы убрал и все таки как никак безопасность повысил. А вообще мне сказали что всему виной было использование двойных кавычек. Надо было обрамлять одинарные кавычки и не было бы такой проблемы.
Я Вас неправильно понял просто) Я думал надо поменять все двойные кавычки на одинарные в том что я отправляю)
Спокойно не живется) Сейчас конечно работа облегчена с работой самого сайта, но вот администраторскую часть и ядро-посредник между ними придетсья еще дорабатывать и дорабатывать)