【问题标题】:PHP and shell, user acces stuffPHP 和 shell,用户访问的东西
【发布时间】:2025-12-16 20:00:02
【问题描述】:

我希望 PHP 能够在它无权访问的文件夹中创建一个文件夹。创建的文件夹最终应该归用户 virtual 和组 virtual。

我已尝试将以下内容添加到 visudo。

virtual  ALL=(ALL) NOPASSWD: /var/mail/virtual
_www ALL=(ALL) NOPASSWD: /var/mail/virtual

我用exec();从php尝试以下命令

sudo -u virtual mkdir /var/mail/virtual/test.com

该命令在通过终端执行时有效,但在通过 php 调用时无效。

谁能告诉我哪里出错了?

服务器运行的是 Ubuntu 14.04 LTS

【问题讨论】:

    标签: php bash shell ubuntu-14.04


    【解决方案1】:

    不知何故,我让它工作了。

    将 visudo 更改为

    www-data ALL=(ALL) NOPASWD: /var/mail/virtual, /var/mail/virtual/dir.sh
    

    将脚本dir.sh放在文件夹中,将PHP部分的命令改为

    sudo /var/mail/virtual/dir.sh $dir
    

    【讨论】:

    • 别忘了双引号你的扩展! :-) 即"$dir"
    • 这种方法引入了一个重大漏洞。如果dir.sh 脚本被修改或替换——www-data 用户可以这样做,因为他们已经获得了对包含它的目录的访问权限! -- 他们可以以系统上的任何用户身份运行任何命令。大哦哦。
    【解决方案2】:

    这里有很多问题。

    1. /etc/sudoers 中的条目指定可以运行的命令,而不是可以访问的目录。

    2. Ubuntu 系统上通常没有_www 用户。该用户名是 Mac OS X 的产物。

    3. 命令行中的第一个用户是被允许调用 sudo 的用户,而不是他们可以运行命令的用户。

    这里更合适的解决方案是:

    www-data ALL = (virtual) mkdir /var/mail/virtual/*
    

    这个命令规范中仍然存在一些微妙的漏洞(可以转义/var/mail/virtual 并在virtual 具有权限的其他位置创建目录),但它比您想出的要安全得多。

    【讨论】: