2

有没有办法让用户安全地编辑 php 代码,例如这是一个基本的 php 代码来回显 Hello World!到页面上。

这个想法是不允许像数组这样的完全编码更改,或者他们可以像这样在 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 脚本的表单

4

6 回答 6

2

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

  echo "Hello World!";

你可以把它改成

  echo $_POST["data"];

在你的 html 中

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

看到它在行动

应该不惜一切代价避免使用 eval,使用 eval 是一个合理的解决方案的问题非常有限。

于 2013-08-02T15:13:02.583 回答
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_functions并且disable_classes可以帮助限制可能的滥用。设置低memory_limit将有助于减少过多的资源消耗。

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

于 2013-08-02T15:18:52.807 回答
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>
于 2013-07-29T14:26:46.693 回答
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>
<?
}
于 2013-07-29T14:25:57.220 回答
0

我想我理解你想要完成的事情。我相信实际任务需要大量与 PHP 相关的 javascript。

所以,让我们在理论上运行它。

假设这是您的起始代码:

$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。

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

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

于 2013-07-31T20:05:56.923 回答
0

这对我来说听起来非常危险。由于 PHP 代码在服务器上运行,您基本上是让任何人和每个人告诉您的服务器运行什么代码,告诉它运行有害代码将非常容易。不幸的是,我想不出一种简单的方法来清理这种类型的输入。

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

于 2013-07-29T14:36:19.740 回答