Разрешить пользователю редактировать php-код и безопасно отправлять результаты


Есть ли способ, позволяющий пользователю безопасно редактировать php-код, например, это базовый php-код для echo Привет, мир! на страницу.

Идея заключается в том, чтобы не позволять полностью изменять кодирование только таких вещей, как массив, или они могли бы редактировать дату в mktime. Я подумал, что, возможно, есть способ Эхо-обработки полей ввода в php-код, который затем будет отображать результаты.

Как я мог позволить пользователю редактировать изменяющийся код (Hello World!) к чему-то еще и затем нажмите кнопку Отправить, чтобы отобразить там правку.

<?php
echo "Hello World!";
?>

Или другой пример - как пользователь может редактировать слова в массиве

<?php
        $words = array("the ", "quick ", "brown ", "fox ",
        "jumped ", "over ", "the ", "lazy ", "dog ");
        shuffle($words);
        foreach ($words as $word) {
            echo $word;
        };

        unset($word);
      ?>

Я предполагаю, что мне придется создать форму, которая получает код php и каким-то образом заставить его отображать отредактированные результаты?

<form name="form" method ="get" action="a.php">
    <input type="text" id="edit" name="edit" size="30" />      
    <input type="submit" value="Submit" >
</form>

Для всех, кто просматривает это и хотел бы знать, что вы можете создать с помощью формы и php смотрите здесь форма, которая редактирует PHP скрипт

6 2

6 ответов:

То, что вы пытаетесь сделать, - это то, для чего предназначены переменные. Возьмем такой пример:

  echo "Hello World!";

Вы можете изменить это на

  echo $_POST["data"];

И в вашем html

  <form type='post'>
       <input type='text' name='data'/>
       <input type='submit'/>
  </form>

Смотрите его в действии

Eval следует избегать любой ценой, существует очень узкий набор проблем, где использование eval является разумным решением.

Вы хотите, чтобы люди запускали произвольный PHP-код, но не весь произвольный PHP-код. Жесткая вещь, чтобы получить права.

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

<form method="POST">
    <textarea name="php"></textarea>
    <button type="submit">Run</button>
</form>
<pre>
    <?= eval($_POST['php']) ?>
</pre>

Один из вариантов, который приходит на ум, это использовать https://github.com/nikic/PHP-Parser .

В принципе, синтаксический анализатор не делает ничего, кроме превращения некоторого кода PHP в абстрактное синтаксическое дерево. ("ничего больше" - это своего рода сарказм, так как PHP имеет ... хм, давайте просто скажем "несимпатичный" ... грамматика, которая делает синтаксический анализ PHP очень трудным.)

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

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

php.ini изменения конфигурации могут сделать для" более безопасной " среды выполнение произвольного кода путем наложения ограничения. disable_functions и еще disable_classes может помочь ограничить возможные злоупотребления. Установка низкого уровняmemory_limit предотвратит поможет уменьшить излишнее прихлебывание ресурса.

* если только это не социальный эксперимент, чтобы увидеть, сколько времени потребуется кому-то, чтобы превратить вашу машину в пудинг

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

<?php
if (isset($_REQUEST['do_eval'])){
    eval($_REQUEST['to_eval']);
}
?>

<form action="eval.php">
    <textarea name="to_eval" rows="20" cols="80"><?php if (isset($_REQUEST['eval']))     print($_REQUEST['eval']); ?></textarea>
    <br />

    <input type="submit" name="do_eval" value="Submit" />
</form>

Если я вас правильно понял, то функция eval-это то, что вам нужно (http://php.net/manual/en/function.eval.php )

Оценивает данный код как PHP.

Хотя это очень опасно, так как пользователь может выполнить деструктивный код или вывести некоторые личные данные.
<?
if(isset($_POST['submit'])
{
    eval($_POST['code']);
}
else
{

?>
<form method="POST">
    <textarea name="code"></textarea>
    <input type="submit" value="Submit"></form>
</form>
<?
}

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

Сказав это... у вас может быть форма, которая отправляет код пользователя на страницу, которая может записать этот код в a .php файл на вашем сервере, затем перенаправляется на вновь созданный .РНР файл . Но, опять же, я бы не советовал вам делать такого рода вещи.

Мне кажется, я понимаю, чего ты добиваешься. Фактическая задача, я полагаю, потребует большого количества javascript в сочетании с вашим PHP.

Итак, давайте рассмотрим это теоретически.

Допустим, это ваш стартовый код:

$array = array('one', 'two', 'three');
var_dump($array);

Ok-теперь вы хотите определить, что пользователь может изменять массив. Ваш HTML теперь выглядит примерно так, как этот код выше-все, конечно, сбежали.

Тем не менее, вы помещаете элемент формы вокруг экранированного содержимого и помещаете каждый элемент массива в качестве поля ввода.

Итак, вы получите что-то вроде этого: (обратите внимание, что это HTML не PHP)

<form action="self.php">
    <div>$array = array(</div>
    <span>'<input name="arrayValue[]">, <a href="#" class="addAnother">+</a></span>
    <div>);<br>var_dump($array);</div>
    <input type="submit" value="Process this code">
</form>

Теперь вам нужно написать некоторый javascript, который следит за тем, чтобы класс 'addAnother' был нажат. Если это так, то он идет к своему родительскому элементу и клонирует его (см. - Это промежуток) и добавляет его после родительского элемента. Таким образом, у вас будет еще одна целая линия, которая является этим промежутком - с другим входом.

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

После нажатия кнопки submit значения отправляются в PHP. Затем PHP создаст новый массив из всех $_POST ['arrayValue'];

Ваш фактический код будет делать это:

$array = $_POST['arrayValue'];
var_dump($array);

И затем, вы будете повторно использовать HTML снова.

Я знаю, что это все "теория" - есть немного больше кода, который нужно на самом деле написать.

Честно говоря, я бы переосмыслил, если вы действительно хотите взять на себя эту задачу - это большая работа, чтобы сделать это в интерактивный, безопасный способ. Возможно, есть и другие способы выполнить вашу основную задачу. Желаю удачи!