Как ограничить доступ к файловой системе в 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 как пользователь, который имеет доступ только к тем файлам, которые вы хотите. но это решение на уровне ОС.