2014-11-19 2 views
2

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

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

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

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

+0

Должно ли это быть временем выполнения? Вы можете регулярно проверять исходный код или даже каждый фиксатор, если он содержит эти ограниченные функции (кроме одного класса-оболочки). – Marek

+1

Я бы сделал это на уровне файловой системы. – Gumbo

+0

@Marek: база кода слишком велика, чтобы проверить ее вручную, и статический анализ кода, вероятно, будет излишним для реализации в этом случае. Мне нужно ограничить только некоторые сценарии большого проекта.Другие скрипты, работающие как один и тот же пользователь, все равно должны напрямую обращаться к файлам. –

ответ

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

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

+0

Звучит неплохо, если не потребуется добавлять отладчик в производственную систему ..: -/ –

+0

Что? Нет необходимости в отладчике? Я добавил пример к моему предложению. – DigitalFiz

+0

Я понимаю ваше предложение, однако мне неудобно использовать APD, поскольку на данный момент он не установлен/не используется. Кроме того, в руководстве указано «Предостережение - APD» - это расширение Zend, изменяющее способ взаимодействия функций функции PHP с функциями PHP и, таким образом, может быть или не быть совместимым с другими расширениями Zend (например, Zend Optimizer). –

0

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

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