PHP——eval的最佳替代品

PHP——eval的最佳替代品,php,Php,每个人都说Eval真的很危险,这就是为什么我在寻找替代方案 我正在构建一个脚本,允许用户在文本区域中编写代码,以便在浏览器中查看结果 我在这里问了一些解决方案,很多人对我说Eval做我想做的事 我实际上在使用Eval,它工作得非常好,但确实很危险,因为有些用户可以在那里放置一些恶意代码,入侵所有网站,进入我的数据库,等等 恢复时,我想找到一些eval的替代品,有没有办法构建一个更安全的脚本 <!-- Textarea for the code !--> Code <form m

每个人都说Eval真的很危险,这就是为什么我在寻找替代方案

我正在构建一个脚本,允许用户在文本区域中编写代码,以便在浏览器中查看结果

我在这里问了一些解决方案,很多人对我说Eval做我想做的事

我实际上在使用Eval,它工作得非常好,但确实很危险,因为有些用户可以在那里放置一些恶意代码,入侵所有网站,进入我的数据库,等等

恢复时,我想找到一些eval的替代品,有没有办法构建一个更安全的脚本

<!-- Textarea for the code !-->
Code
<form method="GET">
<textarea name="code">

</textarea>
<input name="code" type="submit" />
</form>
<br>

<!-- Column with the results !-->
Result
<br>
<?php

if(isset($_GET["codebtn"])) {

  eval('?>' . $_GET["code"] .'<?php');

  }
?>
一般来说,不应使用eval。PHP的创始人拉斯穆斯·勒多夫(Rasmus Lerdorf)最著名的一句话是:

如果eval是答案,那么你几乎肯定问错了问题

这样做的原因是,通常您正在为特定用例寻找一个具有有限用户输入的解决方案,该解决方案可以在不使用eval的情况下安全地满足需求

例外情况是,在您的案例中,您希望为PHP创建一个基于web的测试区域,其全部目的是运行用户代码

这里使用eval的唯一方法是在一个完全隔离的实例中


还有更复杂的选项可用,例如使用只允许执行安全和预先批准的功能的解析器

我建议您将此脚本的处理转移到一个一次性虚拟实例上,最好是囚禁在一个子目录中,该目录的要求刚好满足基本执行的要求。隔离正在执行的代码,然后eval危害更小,仍然不是无害的,但是您可以隔离这些eval的执行位置100%同意上面的说法。唯一的解决办法是适当的监禁。任何其他的解决方案都会被破坏。这就是eval的真正问题——它允许用户执行任意代码块——这正是您要做的。任何适合您的解决方案都适用于eval。您可以使用它来构建自己的评估器。这样,js包装的php代码就无法访问php超全局。你需要确定你想要评估什么样的特性。然后构建一个特定于领域的语言lexer、解析器和计算器,将其编译为可执行的PHP。这允许您在安全性方面提供精确的功能性和灵活性。构建一种简单的语言不需要很复杂,它是一项持续的工作。您可以编写足够的代码来获得基本功能并从中构建它。