2015-07-16 5 views
0

Я пытаюсь настроить среду, которая позволила бы мне иметь один глобальный скрипт на PHP, который может вызывать другие скрипты, расположенные в подкаталогах, которые действуют как плагины. Тем не менее, я пытаюсь убедиться, что скрипты в подкаталогах могут получить доступ только к содержимому своего собственного подкаталога, чтобы убедиться, что я могу обеспечить контроль доступа.Как динамически создавать PHP-песочницы

Для иллюстрации: Folder Structure Файла А может вызвать любой другой файл и проверить их содержимое файла B могут только сценарии доступа и файлы, расположенные в каталоге X Файла B не могут получить доступ к файловым А или файлам, расположенные в любом другом реже чем X (например, Y) файла C могут только сценарии доступа и файлы, расположенные в каталоге Y Файл C не может получить доступ к файловой а или файлы, расположенные в любом другом дир, чем Y (например, X)

Кроме того, я хочу, чтобы убедиться, что любой поддиремент X можно получить по сценариям, расположенным в X.

Есть ли какой-либо способ в среде PHP + Apache для обеспечения такого поведения в автоматическом, безопасном и масштабируемом режиме?

ответ

1

PHP имеет директиву конфигурации, называемую open_basedir, которая «Ограничивает [s] файлы, к которым может обращаться PHP, к указанному каталогу, включая сам файл». (PHP Docs) open_basedir - PHP_INI_ALL, поэтому вы можете установить его через ini_set() до include() в файл или сообщить об этом через директиву командной строки -d.

Если open_basedir недостаточно, вы можете захотеть, чтобы вызываемые скрипты запускались внутри среды chroot. См. http://www.cyberciti.biz/faq/unix-linux-chroot-command-examples-usage-syntax/. Имейте в виду, что для этого требуется много возиться с правами пользователя, потому что chroot хочет запускаться из корневой или корневой учетной записи. PHP также предоставляет функцию chroot(), но я считаю, что она обеспечивает гораздо меньшую гибкость, чем PHP-скрипт, который вызывается с помощью chroot через командную строку.

Конечно, есть еще несколько программ для виртуализации и песочницы. Думаю, эти два решения отвечают вашим целям.

+0

Thx! Не будет использовать init_set(), а затем include() не сдерживать основной скрипт от доступа к контенту из родительского каталога? – Nicolas

+0

Возможно, сбросить его после возврата из include()? =) ... что приводит к другому вопросу: если директива может быть задана из любого места в коде, она также сможет установить ее из встроенного файла. – syck

Смежные вопросы