php - 当 PHP 需要 shell 时使用不同于/bin/sh 的路径

标签 php linux apache shell apparmor

我希望 PHP 在需要 shell 时使用给定路径的可执行文件,而不是在需要 shell 的每种情况下使用默认的/bin/sh(例如 mail() 函数在 UNIX 平台上启动 sendmail, system() 函数、反引号运算符等)。因为我使用 PHP 作为 apache 模块,所以我尝试更改/etc/passwd 中 www-data 用户的 shell,因为网络服务器以该用户身份运行。那没有帮助。我还尝试使用 SetEnv 在 apache 配置中设置 SHELL 变量,但它也没有帮助。我想这样做,因为我想审核 PHP 完成的所有 shell 调用,以记录和/或拒绝/接受它们。它不是禁用 system() 等 PHP 函数的选项,因为现有(无法修改)解决方案使用它。我已经用 C 编写了“受限 shell”代码,我只是错过了让 PHP 在所有情况下使用该二进制文件而不是/bin/sh 的技巧,否则它需要/bin/sh。

是的,我已经问过这个与 mail() 函数相关的问题,但我意识到我需要一个更通用的解决方案,它不仅与 mail() 相关,而且问题是一般的 shell 用法,在许多不同的情况下。我也考虑过在 apparmor 中覆盖路径名的可能性,但我认为这是不可能的。为 apache/PHP 提供自定义 chroot “ jail ”只是为了提供不同的 shell 的解决方案对我来说似乎是一个巨大的矫枉过正的情况:(

提前致谢!

最佳答案

PHP 使用 popen()在这种情况下,它通常被硬编码为使用 /bin/sh -c(例如,参见 glibc's implementation)。

如果设置 chroot jail 确实不是一个选项,并且 AppArmor 提供的还不够,您可能必须修改 PHP 或 libc。

关于php - 当 PHP 需要 shell 时使用不同于/bin/sh 的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17019039/

相关文章:

javascript - 防止在PHP中缓存500个内部错误页面的问题

php - 删除页面中表的行以及数据库中的记录

c# - 在哪里可以找到 Windows 控制台 API 函数的 Linux 对应项?

node.js - 发送请求到 Apache Tomcat (localhost :8080) using GruntJs

java - 替换 Apache POI XWPF 中的文本不起作用

php - 安全网络应用问题

php - 从用户 SQL 中选择第一个图像

javascript - 在 ajax 添加到 Woocommerce 中的购物车事件后运行 javascript 代码

linux - 如何设置回车位置或等效位置?

c++ - Linux - 为什么我的可执行文件将 libpthread 作为共享库?