![是否有可能允许用户以安全的方式执行 PHP 代码?](https://linux22.com/image/561805/%E6%98%AF%E5%90%A6%E6%9C%89%E5%8F%AF%E8%83%BD%E5%85%81%E8%AE%B8%E7%94%A8%E6%88%B7%E4%BB%A5%E5%AE%89%E5%85%A8%E7%9A%84%E6%96%B9%E5%BC%8F%E6%89%A7%E8%A1%8C%20PHP%20%E4%BB%A3%E7%A0%81%EF%BC%9F.png)
我正在考虑开发一种编程测试网站,用户可以在其中编写 PHP 代码,然后在服务器上执行该代码以测试输出。我知道你总是想防止用户执行代码,但是有没有办法可以设置以使系统不受到损害?
或者这是否只会带来太多安全漏洞?
答案1
这只是一个想法。我考虑这个问题的时间还不到几分钟。但实现此目的的一种可能方法是让您的 Web 应用程序以字符串形式接收代码并将其发送到虚拟机进行处理。
这样,您就可以保护提供网站其他功能的 Web 应用程序免受用户任意 PHP 执行的影响。
可以设置虚拟机,使运行的 PHP 脚本无法访问其运行文件夹之外的内容,也无法访问网络的任何部分,除非从主机接收请求并向主机返回数据。您甚至可以将虚拟机冻结在某种状态下,这样对虚拟机所做的任何更改都会在重新启动时撤消。
再次强调,这只是我的想法。可能存在我没有看到的缺点。但要记住的一件关键事情是,您需要确保主机上的 PHP 服务器永远不会执行发送到 VM 或从 VM 返回的代码。
答案2
为增强安全性你必须采取一些措施:
- 您必须禁用许多关键的 php 函数,例如 eval,...
- 您必须配置 open_basedir、execution_time 等等……
- 您必须安装 php suhosin、fcgi 并正确配置它!
- 您必须以不同的用户身份(即测试用户)运行 php,并限制该用户的权限
- 你应该使用 SELINUX 来保护系统
您应该使用 iptables 来限制测试用户执行任何不必要的网络操作:
iptables -t mangle -A OUTPUT -p tcp -m 所有者 --uid-owner 1001 -j REJECT
你必须定期更新你的系统软件!:-)
- 你也可以设置 chrooted 环境
最后,把安全性看作洋葱一样。尽力保护任何一层的系统安全。如果某一层出现安全漏洞,那么底层应该阻止攻击者……
答案3
我认为这是可行的,但如果你想以任何安全的方式做到这一点,你肯定已经做好了准备。这基本上就是任何提供 PHP 的网站托管商为任何愿意向他们投入一点钱的人所做的。
不同之处在于,它对所有人开放,除非您确实计划限制经过身份验证的用户的访问。
您需要了解有关从 PHP/Apache 到操作系统的强化系统的所有信息。不过,强化系统会阻止许多事情,这会限制测试的实用性。
如果您确实追求这一点,我强烈建议您在代码页上使用像 Captcha/reCaptcha 这样的人工验证/反机器人机制。
如果您不太熟悉系统安全那么我个人不会触及它。