不在允许的路径内:/usr/bin/gpg/CentOS 6

不在允许的路径内:/usr/bin/gpg/CentOS 6

尝试使用 PHP filter_var 函数,但在执行时在 error_log 中收到以下内容:

[Wed May 11 10:56:22 2016] [warn] [client 24.69.156.92] mod_fcgid: stderr: PHP Warning:  is_executable(): open_basedir restriction in effect. File(/usr/bin/gpg) is not within the allowed path(s): (/var/www/vhosts/<mydomain>/httpdocs/:/tmp/:/var/www/vhosts/<mydomain>/private/:/usr/share/pear/) in /usr/share/pear/System.php on line 530

我正在运行 CentOS 6 1205160407.13 和 PHP 5.5.35。

“显而易见”的尝试是将 /usr/bin 添加到 open_basedir 路径,但我不确定这会从安全角度产生什么影响。因此,与其尝试,我更希望在这里获得一些见解。

答案1

我个人避免让 PHP 应用程序访问任何可执行文件,除非是真正需要的。设置open_basedir仅在 PHP 代码本身内有效,对外部二进制文件没有任何影响。即使 PHP 应用程序值得信任,也可能被攻击者攻陷。禁用allow_url_includeini 设置、eval()伪函数等可以使这些攻击变得更加困难,但使用 PHP 永远不会真正安全。

bin/我使用的解决方法是每个 Web 应用程序都有一个单独的目录(/srv/bin/web/WEBAPP_ID在我的例子中),只有一组已知安全的可执行文件。为 PHP 解释器设置 PATH 系统变量以包含此目录。硬链接或 shell 包装器脚本可能用于这些目录中,以避免重复可执行文件(符号链接在这里没有意义,因为它们在强制实施 basedir 限制之前被 PHP 取消引用)。shell 包装器还允许限制传递给实际可执行文件的参数。在类 UNIX 系统上,使用noexec标志挂载所有可由 PHP 应用程序写入的目录也很有意义。

GhostScript 的 shell 包装器的工作示例(如果需要,您可以添加一些日志记录):

#!/bin/bash

GS_BASE_DIR="/path/to/temp/directory"

for T_ARG in "${@}"; do
        case "${T_ARG}" in
                '-d'*|'-q'|'-r'*x*|'-sDEVICE='*|"-sOutputFile=${GS_BASE_DIR}/"*|'-sOutputFile=-'|'-f-'|"-f${GS_BASE_DIR}/"*|"${GS_BASE_DIR}/"*|'-')
                        # OK - no op
                ;;
                *)
                        exit 254;
                ;;
        esac
done

exec /usr/bin/gs "${@}"

相关内容