【问题标题】:type php code into textarea, store in database, then execute在 textarea 中输入 php 代码,存储在数据库中,然后执行
【发布时间】:2010-12-22 12:16:09
【问题描述】:

任何人都知道我会如何去做这样的事情。

我有一个 textarea 设置,允许用户编辑页面内容。然后将内容存储在数据库中,并在前端由 php 在 html 模板中检索。类似:

<html>
yada yada...
<?php
echo get_page_contents_by_id($_GET['id']);
?>
yada yada...
</html>

它全部在一个 .php 文件中运行,以防有人想调用它。

我想知道的是,因为我是通过 php 从数据库中获取内容的,有没有什么方法可以检索该内容中的 php 代码并在不进行任何文件写入的情况下仍然运行它。

【问题讨论】:

  • 警惕允许任何有权访问该网页的人执行任意 PHP 代码的安全隐患。
  • 同意,这听起来很危险。

标签: php html content-management-system


【解决方案1】:

下面是在textarea中执行代码的代码。

    <?php 
if($_POST){
    print_r($_POST);
    extract($_POST);
    $file = rand(1000,10000);  // creating file with random number
    file_put_contents($file.'.php', '<?php '.$code.' ?>');
    ob_start();
    include $file.'.php';
    echo ob_get_clean();
    unlink($file.'.php');   // deleting the created file after execution.
    die('test');
}
?>
<textarea id="testcode" ></textarea>
    <input type="submit" onClick="return changePermissions1()" />
    <script>
    function changePermissions1(){
        var code = {};
        code['code'] = $("#testcode").val();
        var pass_url = "executefile.php"; // there you can pass the code
        $.ajax({
            type        : "POST",
            beforeSend  : loadingStarts,
            url         : pass_url,
            data        : code,
            success     : function(responseText){`enter code here`
                loadingEnds();
                alert(responseText);
            }
        });
    }
    </script>

【讨论】:

    【解决方案2】:

    考虑另一种选择。真的。

    无论您进行任何安全检查、函数解析等,这仍然是一个极度的坏主意。

    一个稍微不那么糟糕的主意,为什么不研究像http://www.smarty.nethttp://www.google.com/search?q=php+template+engine这样的模板解决方案

    【讨论】:

      【解决方案3】:

      我尝试做同样的事情,但添加了标签和普通的 HTML 标签。这行不通。如果您需要将 HTML 与 PHP 一起存储,请考虑使用更 XHR 的解决方案,减少对每个页面的 PHP 代码的依赖。

      【讨论】:

        【解决方案4】:

        eval() 正如 James Goodwin 和 Gazler 所说,实际上是从字符串数据执行 PHP 代码的唯一方法。

        除了安全后果 - 通过访问您的 mySQL 数据可能会危及您的整个网站 - 这种方法会使代码非常难以调试,因为您必须通过 eval 跟踪所有错误消息()d 代码。

        【讨论】:

        • 当我看到 eval() 时,每个人都告诉我的一切都回来了。我会想出一种更安全的方法来执行我正在尝试做的事情。谢谢!
        【解决方案5】:

        您可以为此目的使用 eval。

        http://php.net/manual/en/function.eval.php

        【讨论】:

          【解决方案6】:

          您可以使用 PHP eval() 方法来执行从数据库返回的 PHP 代码 - 就像它实际上是直接写在您的 PHP 文件中一样。

          例如

          <?php
          eval("echo('hello world');");
          ?>
          

          打印:

          你好世界

          【讨论】:

          • 是的,当您想在产品中创建安全漏洞以方便入侵您的网站时,这真是太棒了。
          • 我希望有权输入 PHP 代码的人是受信任的用户,但我同意这不是一个好主意。最好只给用户一个所见即所得的编辑器或某种基本的模板语言。
          • 其实我想出了一个更好的方法来做到这一点。更多代码。但更安全。因为只有少数方法(我已经定义)我想被调用。我正在从字符串中删除方法调用,然后使用 call_user_func() 确保被调用的方法确实存在。
          • 这可能是实现小型模板系统的好地方,该系统仅适用于定义的一组函数。
          猜你喜欢
          • 1970-01-01
          • 2014-11-30
          • 1970-01-01
          • 2012-06-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-11
          相关资源
          最近更新 更多