Разрешить пользователю редактировать 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 ответов:
То, что вы пытаетесь сделать, - это то, для чего предназначены переменные. Возьмем такой пример:
echo "Hello World!";
Вы можете изменить это на
echo $_POST["data"];
И в вашем html
Eval следует избегать любой ценой, существует очень узкий набор проблем, где использование eval является разумным решением.<form type='post'> <input type='text' name='data'/> <input type='submit'/> </form>
Вы хотите, чтобы люди запускали произвольный 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 снова.
Я знаю, что это все "теория" - есть немного больше кода, который нужно на самом деле написать.
Честно говоря, я бы переосмыслил, если вы действительно хотите взять на себя эту задачу - это большая работа, чтобы сделать это в интерактивный, безопасный способ. Возможно, есть и другие способы выполнить вашу основную задачу. Желаю удачи!