За последние 24 часа нас посетили 34954 программиста и 1712 роботов. Сейчас ищут 923 программиста ...

Заносим в переменную php код как текст. В чем ошибка?

Тема в разделе "Прочие вопросы по PHP", создана пользователем feramount, 8 янв 2014.

  1. feramount

    feramount Активный пользователь

    С нами с:
    6 авг 2013
    Сообщения:
    18
    Симпатии:
    0
    Вообщем пытаюсь написать скрипт сохранения PHP кода в БД и натыкаюсь на следующую проблему.
    Передаю из textarea следующий код
    Код (Text):
    1.  
    2. function FormAddCreate($table)
    3. {
    4.     $result = '';
    5.     $SQL = 'DESCRIBE '.$table;
    6.     $Query = mysql_query($SQL);
    7.     $result .= '<form action="/core/index.php"><table width="100%">';
    8.     $result .= $this->get_input_hidden('action','value="add"');
    9.     $result .= $this->get_input_hidden('table','value="'.$table.'"');
    10.     while ($row = mysql_fetch_array($Query))
    11.     {
    12.         $result .= '<tr>';
    13.         if ($row['Field'] <> 'id')
    14.         {
    15.             if ($row['Type'] == 'text')
    16.             {
    17.                 $result .= '<td>'.$row['Field'].'</td><td>'.$this->get_input_text($row['Field']).'</td>';
    18.             }
    19.             else if ($row['Type'] == 'longtext')
    20.             {
    21.                 $result .='<td>'.$row['Field'].'</td><td>'.$this->get_textarea($row['Field'],"rows=15 style='width:100%;'").'</td>';
    22.             }
    23.             else
    24.             {
    25.                 $result .= '<td>'.$row['Field'].'</td><td>'.$this->get_input_text($row['Field']).'</td>';
    26.             }
    27.         }
    28.         $result .= '</tr>';    
    29.     }
    30.     $result .= '</table></form>';
    31.     return $result;
    32. }
    Затем в файле обработчике обрабатываю весь POST массив
    Код (Text):
    1.  
    2.     foreach ($_POST as $key => $value)
    3.     {
    4.         $post .= '$V_'.$key.' = "'.trim(mysql_real_escape_string($value)).'";';
    5.         $_POST[$key] = trim($value);
    6.     }
    Затем выполняю все то что занес в $post через eval
    Код (Text):
    1.  
    2. if (isset($post)) {eval ($post);}
    Но eval не может обработать ту функцию что передал через textarea. Скажите пожалуйста что я делаю не правильно?
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Это пользователи могут отправлять скрипты?
     
  3. feramount

    feramount Активный пользователь

    С нами с:
    6 авг 2013
    Сообщения:
    18
    Симпатии:
    0
    Нет, это только из админской панели можно
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    и при этом он обязательно на что-то ругается и что-то говорит. Текст ошибки в студию :)

    Добавлено спустя 54 секунды:
    надеюсь, вы защитили ваши поля ввода, знаете что такое CSRF. Как и то, что отправить POST-запрос на указанный адрес может любое быдло, не заходя на сайт и не логинясь в админку. А то сами себе шелл залили, считай.
     
  5. feramount

    feramount Активный пользователь

    С нами с:
    6 авг 2013
    Сообщения:
    18
    Симпатии:
    0
    Ой извиняюсь)
    Код (Text):
    1.  
    2. 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
    Спасибо. Почитаю по этому поводу.
     
  6. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Покажите что выводит $post. Без eval.
     
  7. feramount

    feramount Активный пользователь

    С нами с:
    6 авг 2013
    Сообщения:
    18
    Симпатии:
    0
    Код (Text):
    1.  
    2. $V_action = "add";
    3. $V_table = "Cardinal_Classes_Functions";
    4. $V_Function_ID = "";
    5. $V_classes_ID = "2";
    6. $V_Name = "FormAddCreate";
    7. $V_PhpScrypt = "function FormAddCreate($table)\r\n{\r\n $result = \'\';\r\n $SQL = \'DESCRIBE \'.$table;\r\n    $Query = mysql_query($SQL);\r\n $result .= \'
    8. \';\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 .= \'
    9. \'.$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\']).\'
    10. \';\r\n return $result;\r\n}";
    11. $V_send = "Добавить";
     
  8. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    И вы удивляетесь, что не работает? Странно ;)
     
  9. feramount

    feramount Активный пользователь

    С нами с:
    6 авг 2013
    Сообщения:
    18
    Симпатии:
    0
    Может не стоит постить не информативные ответы а помочь человеку?)
     
  10. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Уберите символы табуляций, и замените двойные ковычки на одинарные.
    Да и вообще, зачем так делать?
     
  11. feramount

    feramount Активный пользователь

    С нами с:
    6 авг 2013
    Сообщения:
    18
    Симпатии:
    0
    Мне почему то так показалось удобно в самом начале.
    Убрал не помогло. Подсказали что ругается на квадртатные скобки, но после того как их проэкранировал обратным сешем получил новую ошибку.
    Код (Text):
    1.  
    2. 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
     
  12. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Откажитесь вообще от eval-а, мой вам совет. Лучше сделайте для себя API строгий, который будет работать на нормальных гет\постах. А то горя еще хлебнете не раз.
     
  13. feramount

    feramount Активный пользователь

    С нами с:
    6 авг 2013
    Сообщения:
    18
    Симпатии:
    0
    Спасибо. Я сейчас как раз к этому и стремлюсь, проанализировав свои ошибки.
     
  14. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Конечно для таких задач, лучше всего использовать HTTP запросы.
    Тем - более вы же отправляете из форм, а значит лучше сделать поля для каждого действия и подставить их в скрипте.
    А eval пригождается для реализаций, когда у вас динамика идет в самом скрипте, а не от пользователя.
    Не рекомендую так вот просто взять и отправленные скрипты запускать через eval.
     
  15. feramount

    feramount Активный пользователь

    С нами с:
    6 авг 2013
    Сообщения:
    18
    Симпатии:
    0
    Ну я так и сделал. И проблемы убрал и все таки как никак безопасность повысил.
    А вообще мне сказали что всему виной было использование двойных кавычек. Надо было обрамлять одинарные кавычки и не было бы такой проблемы.
     
  16. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Я же выше об этом написал ;)
     
  17. feramount

    feramount Активный пользователь

    С нами с:
    6 авг 2013
    Сообщения:
    18
    Симпатии:
    0
    Я Вас неправильно понял просто) Я думал надо поменять все двойные кавычки на одинарные в том что я отправляю)
     
  18. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Бывает...
    Ну главное, что сейчас вы уже поменяли логику и живете спокойно;)
     
  19. feramount

    feramount Активный пользователь

    С нами с:
    6 авг 2013
    Сообщения:
    18
    Симпатии:
    0
    Спокойно не живется)
    Сейчас конечно работа облегчена с работой самого сайта, но вот администраторскую часть и ядро-посредник между ними придетсья еще дорабатывать и дорабатывать)
     
  20. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Ну дак, без этого никуда;)