Изоляция в PHP? - PullRequest
       5

Изоляция в PHP?

3 голосов
/ 02 мая 2011

Вот кое-что, о чем я думал некоторое время.
Я создаю приложение, в котором мои пользователи будут загружать свои собственные темы, а это значит, что у любого, кто имеет базовые навыки PHP / XSS / любой другой навык, будет хорошая возможность вызвать много головной боли.

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

Будет ли это хорошей практикой и как это будет сделано?

Ответы [ 4 ]

4 голосов
/ 02 мая 2011

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

4 голосов
/ 02 мая 2011

Чтобы разрешить произвольный html / javascript, тогда у каждого пользователя должен быть свой собственный поддомен.Если у каждого пользователя есть свой собственный поддомен, то пользовательский JavaScript будет ограничен своей собственной песочницей из-за Same Origin Policy .Если вы хотите разрешить только «безопасный html», тогда htmlpurifer - это вариант, и вы можете использовать 1 домен.

Разрешение нестандартного PHP немного опаснее.Поставщики «общего хостинга» полагаются на suPHP , что заставляет скрипт php запускаться от имени конкретного пользователя.Это потребует от каждого пользователя иметь свою учетную запись в вашей системе.Этот метод защиты существует уже давно.Это не идеально, но это помогает.

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

  1. smarty , у него нет лучшего секретного послужного списка, но вы держите его в актуальном состоянии, у вас, вероятно, не будет проблем.Он должен быть сконфигурирован для запрета нативного php .
  2. twig - это относительно новый движок от создателей Symfony Framework.Это означает, что у него есть приличная база разработчиков и, поскольку он поставляется с Symfony, он также был протестирован в дикой природе.Twig не позволяет вызывать какие-либо функции PHP, если вы специально не создадите для них функцию / фильтр Twig.
1 голос
/ 02 мая 2011

глобальная область видимости всегда будет доступна.

но объектно-ориентированная концепция предоставляет многое. то, что вы не можете сделать, это скрыть глобальные вещи. что вы можете сделать, так это не сделать его видимым.

, но выполнение непросмотренного стороннего кода - сложная вещь. Я бы порекомендовал какую-то изоляцию процесса здесь, если это возможно. это означает, что вы открываете процесс, используя popen или что-то еще, в сочетании с suphp вы можете сделать пользователя с ограниченными правами в Linux. это очень хорошо возможно и безопасно с правильными мерами безопасности.

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

когда дело доходит до HTML-кода, это намного проще. Есть хорошие HTML Tidy это хорошее начало. Есть хорошие решения, позволяющие использовать только специальные теги.

javascript может быть «защищен» так, как это делали старые приложения Facebook fbml. что включает переписывание на стороне сервера, имена динамических переменных и т. д. это довольно сложно.

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

edit: конечно, вы можете анализировать любой код и ограничивать его определенными утверждениями или отклонять определенные утверждения, но это очень сложно и для php очень тяжелое ограничение. Вероятно, лучше переключиться на более высокоуровневые алгоритмические языки или перейти на сторону клиента с javascript.

0 голосов
/ 03 мая 2011

То, что вы хотите сделать, действительно рискованно. Вы никогда не должны позволять своим пользователям загружать файлы PHP. Вот почему вы не можете найти много PHP-фиддлеров в сети (хотя теперь они есть).

Кроме того, JS опасен в некоторых косвенных отношениях, и практически никто не позволяет вам загрузить его (за заметным исключением Tumblr).

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

Поскольку безопасность является проблемой, попробуйте проверить рекомендации по безопасности, такие как Secunia при выборе движка шаблонов.

...