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


Allow a user to edit a php code and submit the results securely

有没有一种方法可以让用户安全地编辑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创建什么的人,请参阅此处编辑php脚本的表单

您试图实现的是变量的用途。举个例子:

  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代码转换为抽象语法树。("nothingmore"在这里有点讽刺,因为PHP有一个…嗯,让我们只说"not nice"…语法,这使得解析PHP非常困难。)

然后,您可以遍历AST并删除可疑表达式,重新构建要编码的树,然后调用它上的eval()

除此之外,配置沙箱环境在这里至关重要,因为没有什么是万无一失的。这样,当有人不可避免地用砖块砸盒子时,你就可以恢复它

php.ini配置的更改可以通过施加限制来创建一个"更安全"的环境来执行任意代码。CCD_ 4和CCD_。设置较低的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代码在服务器上运行,您基本上是让任何人告诉您的服务器要运行什么代码,而让它运行有害代码将非常容易。不幸的是,我想不出一种微不足道的方法来净化这种类型的输入。

话虽如此。。。您可以有一个表单,将用户的代码提交到一个页面,该页面可以将代码写入服务器上的.php文件,然后重定向到新创建的.php文件。但是,再说一遍,我不建议你做这种事。

我想我理解你想要实现的目标。我认为实际的任务将需要大量与PHP相关联的javascript。

所以,让我们从理论上分析一下。

假设这是您的起始代码:

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

好的,现在您需要定义用户可以修改数组。您的HTML现在看起来像上面的代码——当然都是转义的。

但是,您将form元素放在转义的内容周围,并将每个数组元素作为输入字段。

因此,您最终会得到这样的结果:(注意,这是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。

我知道这都是"理论"——实际上还有更多的代码要写。

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