Как ограничить доступ к файловой системе в 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

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

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

Другие вопросы по тегам