Как ограничить доступ к файловой системе в PHP?

Кто-то знает хитрость, чтобы PHP-скрипт самостоятельно ограничивал доступ к файловой системе (fopen, file_get_contents так далее.)?

Такие звонки должны быть заблокированы Кроме для нескольких выбранных имен файлов (файл журнала, доступ к /tmp и тому подобное).

Это не вещь безопасности, а скорее средство принуждения команды разработчиков не получить доступ к файловой системе непосредственно (и обнаружить пятна в существующем коде, где это уже имеет место). Мы хотим видеть исключение в этом случае (которое будет поймано и сообщено), так как доступ к содержимому таких файлов должен осуществляться другими способами.

Я думал о реализации моей собственной streamWrapper для file:// протокол, но, видимо, нет возможности простираться встроенный класс filewrapper.

2

Решение

Опция 1

Ты можешь использовать open_basedir которая является директивой php.ini для ограничения каталогов, к которым у приложения тоже есть доступ. Каталоги могут быть разделены точкой с запятой, так что вы можете просто перечислить каталоги, к которым вы хотите, чтобы приложение получило доступ, включая папку / tmp.

Предостережение заключается в том, что это также влияет на такие вещи, как include, require.

Вариант № 2

Вы можете переименовать их, используя rename_function или же runkit_function_rename а затем оберните переименованные версии с вашей собственной логикой.

Цитата из документации:

Переименовывает orig_name в new_name в глобальной таблице функций. полезным
для временного переопределения встроенных функций.

Пример:

rename_function('file_get_contents', 'nouse_file_get_contents');

function file_get_contents($filename, $use_include_path = false, $context, $offset = -1, $maxlen) {
//
// Do some validation here
//
return nouse_file_get_contents($filename, $use_include_path, $context, $offset, $maxlen);
}

Вариант № 3

Вы можете настроить некоторые стандарты кодирования для своих разработчиков и написать несколько модульных тестов, которые выполняются как часть развертывания, прежде чем все будет запущено в производство. Не уверен, каковы ваши процедуры выпуска, но эти типы вещей должны быть пойманы до производства.

2

Другие решения

Конечно, вы можете сделать так, чтобы все разработчики запускали php как пользователь, который имеет доступ только к тем файлам, которые вы хотите. но это решение на уровне ОС.

0

По вопросам рекламы [email protected]