Недопустимые пути: /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_include
настройка ini, eval()
псевдо-функция и т. д. могут усложнить эти атаки, но с PHP вы никогда не будете в безопасности.
Обходной путь, который я использую, должен иметь отдельный bin/
каталог для веб-приложения (в моем случае/srv/bin/web/WEBAPP_ID), только имеющий набор исполняемых файлов, о которых известно, что они безопасны. Задайте системную переменную PATH для интерпретатора PHP, чтобы включить этот каталог. Жесткие ссылки или сценарии оболочки могут потенциально использоваться в этих каталогах, чтобы избежать дублирования исполняемых файлов (здесь символические ссылки не имеют смысла, поскольку они разыменовываются в PHP перед применением ограничений basedir). Оболочки оболочки также позволяют ограничить аргументы, передаваемые фактическому исполняемому файлу. В UNIX-подобных системах также имеет смысл иметь все каталоги, доступные для записи приложениями PHP, смонтированными с noexec
флаг.
Рабочий пример оболочки оболочки для GhostScript (при необходимости вы можете добавить некоторые записи):
#!/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 "${@}"