允许用户编辑php代码并安全地提交结果

时间:2013-07-29 14:19:40

标签: php forms input edit

有没有办法允许用户安全地编辑PHP代码,例如这是一个基本的PHP代码来回应 你好,世界!到页面上。

这个想法不是允许完全编码更改像数组这样的东西,或者他们可以在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创建的内容的任何人,请参阅此处Form that edits php script

6 个答案:

答案 0 :(得分:2)

您要完成的是变量的用途。 举个例子:

  echo "Hello World!";

您可以将其更改为

  echo $_POST["data"];

并在你的HTML中

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

See it in action

应该不惜一切代价避免使用Eval,使用eval是一个理智的解决方案存在一系列非常狭窄的问题。

答案 1 :(得分:2)

您希望人们运行任意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_functionsdisable_classes可以帮助限制可能的滥用行为。设置低memory_limit将有助于减少过多的资源匮乏。

*除非这是一个社交实验,看看有人将您的机器变成布丁需要多长时间

答案 2 :(得分:1)

理论上你可以做这样的事情,但是请不要这样做,因为它非常不确定

<?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>

答案 3 :(得分:0)

如果我说得对,那么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>
<?
}

答案 4 :(得分:0)

这对我来说听起来非常危险;因为PHP代码在服务器上运行,所以基本上让任何人和每个人都告诉你的服务器运行什么代码,并告诉它运行有害的代码将非常容易。不幸的是,我想不出一种消除这种输入的简单方法。

话虽如此......您可以使用表单将用户的代码提交到服务器上write that code into a .php file的页面,然后redirects to the newly created .php file。但是,我再也不建议你这样做。

答案 5 :(得分:0)

我想我明白你要完成的事情。我认为实际的任务需要大量的javascript与你的PHP相关联。

所以,让我们从理论上来说吧。

让我们说这是你的开始代码:

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

好的 - 所以现在你要定义用户可以修改数组。您的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”类。如果是这样,它会上升到其父元素并克隆它(请参阅 - 这是跨度)并将其添加到父元素之后。通过这种方式,您将拥有另一个整行,即另一个输入。

如果您将输入样式设置为看起来不错,则可以使其看起来像用户输入内联。

按下提交后,值将发送到PHP。然后,PHP将从所有$ _POST ['arrayValue']创建一个新数组;

您的实际代码将执行此操作:

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

然后,您将再次重新呈现HTML。

我知道这就是'理论' - 实际写的代码要多一些。

老实说,如果你真的想要承担这项任务,我会重新思考 - 这是以交互式,安全的方式完成这项工作的很多工作。也许还有其他方法可以完成您的核心任务。祝你好运!