我想为 c 程序制作一个在线评判器。我捕获了文本区域中的用户输入并从中创建了 .c 文件。现在它希望 php 运行 linux 命令“gcc code.c
我这样做了
$cmd=gcc -std=c99 code.c -g -Wall
$last=exec($cmd,$out,$status);
按照 stackoverflow 的建议。但是这个命令不起作用。它返回状态 1。但是其他 linux 命令(如 date、pwd 等)工作正常。
我怀疑的问题是whoami
命令中说的是“nobody”。现在,这个“nobody”可能没有权限运行 gcc。所以,请告诉我如何让它工作或者如何为用户“nobody”分配权限?
我知道这非常不安全。但就这样吧。请给出解决方案以使命令正常工作。
答案1
不
你不使用nobody
。nobody
永远不应该用于任何事情。nobody
是一个非人。
使用nobody
做事情意味着授予nobody
权限。 一旦你这样做了,你就会开始走下坡路,最终你会nobody
成为该组的成员wheel
并su
成为 root 用户,因为这更容易,然后你的系统被外星黑客攻陷,整个星球都沦陷了,它都是你的错。不
你不能直接拿别人的代码去执行。
你甚至不能拿你自己的代码并执行它。
执行不受信任的用户输入是糟糕且错误。
如果您想做到这一点,您可以启动完全隔离的虚拟机,在完全隔离的沙箱中编译和执行程序,无需网络连接,也无法访问外部机器。
如果 Stack Overflow 上有人暗示这是好主意这个人是个白痴。这就是我们不让开发人员管理生产环境的原因。
答案2
停下来,不要过去,不要收集网络疱疹。
请你,请你去调查一下Docker并了解为什么这样的方法是解决这个问题的更好的方法。