我想用 PHP 脚本运行命令行程序。在 VPS 上执行此操作有哪些安全问题?
我经常听说这不安全。但想知道具体是怎么回事吗?此外,运行该命令的最佳方法是什么。
编辑:我想同时运行 cutycapt(一个截图工具)和 xvfb-run(虚拟窗口)。因此它需要权限。
答案1
允许脚本运行命令行工具可能安全也可能不安全。这很大程度上取决于你正在做什么。
请考虑以下两种情况:
ls /tmp
运行并显示输出的脚本
这可能没什么问题。但你可能存在信息泄露(访问该页面的人知道服务器上的内容/tmp
,这可能会让他们知道如何绕过你的安全措施)。grep
用于文件中用户指定字符串的脚本
这可能是不是很好:脚本会调用类似的东西system("grep $user_string /some/file")
,有创造力的攻击者可以弄清楚它在做什么,;
在位中插入额外内容$user_string
,然后以 Web 服务器的用户身份运行任意代码。
您可以采取一些缓解措施来处理上述 (2) 的问题(PHP 有escapeshellarg()和escapeshellcmd()来帮助您),但最重要的是,任何时候您允许 Web 应用程序执行命令,您就将自己暴露在命令注入攻击之下,因此您需要彻底规划、审核和保护您的代码(包括您正在调用的命令),以确保您不会让自己受到攻击。
如果您尝试做的事情可以通过(安全编写的)本机 PHP 来完成,那么这对于速度和安全性来说几乎总是一个更好的选择。
答案2
要在 apache 下以特权运行程序(包括通过 PHP),似乎一致认为无密码sudo
是正确的工具。
如何从非 root 帐户执行 root 操作?是我之前的一个回答,对这个问题讨论得比较详细,也给出了例子,似乎得到了一些认可。
答案3
我的建议是编写一个包含所有需要运行的命令的 shell 脚本。这样 PHP 就不会直接运行命令,而是使用包装器脚本来完成所需的操作。此外,您可以根据需要使用 sudo 并编辑 sudoers,以帮助您运行需要更高权限的命令。