我正在使用 Apache + PHP 的自定义编译安装,监听端口80
。
Apache 配置为以普通用户身份运行,并具有正确的设置User
和Group
文件httpd.conf
。
将 apache 作为服务运行后,apachectl
有一个进程httpd
由 root 运行,另外 4 个进程由该普通用户运行。
问题是这样的:
- 当我通过 PHP 运行外部命令(例如使用
exec
或passthru
)时,它是由正确的普通用户运行的,但$HOME
环境变量指向/root
.
例如,使用以下非常简单的代码:
<?php
echo "Home: " . `echo \$HOME`;
echo "<br />";
echo "Id: " . `id`;
我得到:
Home: /root
Id: uid=1000(normaluser) gid=100(users) groups=100(users),17(audio),33(video)
以这种方式运行的任何命令实际上都是由普通用户运行的,因此不存在安全问题。主要问题是当运行外部命令时,该命令尝试从主目录写入和/或读取某些内容。
答案1
我希望它只读取由任何 shell 启动(Apache 进程)echo $HOME
设置的环境变量。httpd
除非有什么事情发生export HOME=/home/whatever
,否则环境变量 HOME 的值将保持不变。
我不确定你的最后一段是否正确。只要没有安全问题,是否PATH
设置为normaluser
?如果 /home/normaluser/bin 包含一个非常特殊的ls
可执行文件,它可以执行不寻常的操作,例如生成系统上任何文件的可下载 HTTP 输出,该怎么办?在我的 Apache/PHP 设置中, /usr/local/bin:/bin:/usr/bin:/u/bediger/bin
PHP 程序的PATH 设置为。
您关于主要问题的断言,即从主目录中读取/写入某些内容,也没有意义。 HOME 的值对于部分限定文件名并不重要,当前工作目录很重要。httpd
似乎为我的测试 PHP 程序设置正确。我的 Apache/PHP 设置将当前工作目录设置为文档根目录,这是我的 PHP 所在的位置。
<html>
<head><title>Test</title></head>
<body>
<p>
<?php
echo "Home: " . `echo \$HOME`;
echo "<br />";
echo "Id: " . `id`;
echo "<br />";
echo "PWD: " . `pwd`;
echo "<br />";
echo "PATH: " . `echo \$PATH`;
?>
</p>
</body>
</html>