Кто-то знает хитрость, чтобы PHP-скрипт самостоятельно ограничивал доступ к файловой системе (fopen
, file_get_contents
так далее.)?
Такие звонки должны быть заблокированы Кроме для нескольких выбранных имен файлов (файл журнала, доступ к /tmp
и тому подобное).
Это не вещь безопасности, а скорее средство принуждения команды разработчиков не получить доступ к файловой системе непосредственно (и обнаружить пятна в существующем коде, где это уже имеет место). Мы хотим видеть исключение в этом случае (которое будет поймано и сообщено), так как доступ к содержимому таких файлов должен осуществляться другими способами.
Я думал о реализации моей собственной streamWrapper для file://
протокол, но, видимо, нет возможности простираться встроенный класс filewrapper.
Опция 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 как пользователь, который имеет доступ только к тем файлам, которые вы хотите. но это решение на уровне ОС.