Страницы

Поиск по вопросам

понедельник, 25 ноября 2019 г.

Безопасный запуск php файла


Здравствуйте. Делаю что-то вроде сайта с редактором PHP кода. При нажатии на клавиш
просмотра, у меня в специальной директории создаётся папка с уникальным id и в ней файл с самим php кодом (пример: /_projects/6dfh78d76dfg87/index.php). Дальше эта страничка открывается в iframe.

Так вот к проблеме: столкнулся с проблемой безопасности. С созданного файла можн
редактировать любой файл сайта (.htaccess и другие файлы сайта). Я набросал пару вариантов, как можно ограничить доступ к файлам своего сайта:


Защитить изменение и удаление важных файлов (но тут недостаток: можно редактировать файлы чужого "проекта")
Запретить файлам с директории /_projects/{ID}/ обращаться к
файлам, которые находятся вне папки {ID}
Запретить некоторые функции в PHP
Скрыть директории и файлы от функций таких, как scandir,
dirname...
Проверять PHP файл на наличие запрещённых функций


Но не знаю, как можно осуществить эти варианты. Подскажите, как можно их осуществить или кто-то знает вариант получше? Буду очень признателен. Заранее спасибо.
    


Ответы

Ответ 1



Самым надежным вариантом будет запуск кода внутри контейнера (например, Docker) настроенным SECCOMP и selinux SELinux. При этом вы можете запускать любой код, а не только PHP. Код может делать почти всё, что угодно и ограничить его можно как угодно. Презентация о том как можно обезопасить Docker container: Слайды и Видео

Ответ 2



@Yuri, судя по пути из вашего примера - речь идет о *nix системе. А там все просто самое главное - обозначить "бизнес логику" вашего проекта. Иными словами обозначить "кто может что". для PHP выделяем отдельного "пользователя" обозначаем ему права Таким образом он не сможет сделать то, что ему не позволено. Важно Важно права десять раз продумать. Пример. Пользователю дано право/возможность создават любой файл. Пользователь создает файл с расширением .php... а потом возьмет и его исполнит. Вы понимаете, что он сможет сделать все, что в "доступности" прав пользователя, имеющего доступ к ресурсам *.php Таки образом Используя встроенные средства *nix вы ограничиваете множество действий, которые пользовател может выполнить в принципе. А в своем скрипте - вы "предусматриваете" нужный вам функционал. Для обеспечения безопасности - этого хватит вполне. Понятие "любой файл" нужно четко определить. Путем, маской, зарезервированным названием... Хороший принцип "запретить все, потом нужное разрешить". Это ваш случай.

Ответ 3



На мой взгляд самый простой способ это просто проверять токен и id пользователя при редактировании файла. У вас это решение номер 2. 1 Авторизоваться 2 получить список файлов и папок /_projects/{ID}/ 3 Если пользователь может ввести путь самостоятельно, то парсить путь и сопоставлять {ID} папки и {ID} пользователя Как ещё один вариант: Сгенерировать уникальную папку владельца, путь к которой буде сложно подобрать, например, KMnwVmc6Uz7zsJ4w, этот вариант менее безопасный. Так как редактирование вы не закрываете, а просто полагаетесь, что папку никто не найдет

Ответ 4



Выполняйте скрипты централизованно, через include в собственном сценарии роутинга. Там Вы можете через директиву ограничить доступ к файловой системе для каждого пользователя ресурса: ini_set('open_basedir', $userProjectDir); Выше $userProjectDir в текущем сеансе исполнения подняться не удастся. Путь к директории должен быть абсолютным. Далее, есть ещё одна проблема - доступ к localhost. Пользовательский скрипт долже иметь доступ только к разрешённым портам. Этого можно достичь либо ограничением пользователя среды исполнения (php-fpm, apache, ..) в iptables, либо виртуализацией. Виртуализация так же позволяет ограничивать ресурсы машины по отношению к пользователю.

Комментариев нет:

Отправить комментарий