Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 23.08.2015 02:12:48

Запретить шаблонизатору доступ к файлам и функциям

Здравствуйте. Столкнулся с такой проблемой - если в файле шаблона набрать код

{{ include("../.env") }}
{{ exec('mkdir ./123') }}

то выведится все содержимое файла и создастся папка.
Есть какая-нибудь возможность запретить доступ из файлов шаблона к файлам фреймворка и разрешить только определенные функции?

Изменено Pr00f (23.08.2015 02:14:46)

Не в сети

#2 24.08.2015 10:26:38

Re: Запретить шаблонизатору доступ к файлам и функциям

Шаблонизатор — это просто обертка для обычного PHP-кода, поэтому в нём нельзя запретить что-либо (exec можно запретить в php.inif disabled_functions, но это будет работать для всех скриптов на сервере). А в чём проблема? Вы же не даёте возможности пользователю вставлять свой код в шаблоны?

Не в сети

#3 24.08.2015 15:31:30

Re: Запретить шаблонизатору доступ к файлам и функциям

Я понимаю, что это просто обертка. Но там ведь можно задать какие функции игнорировать при парсинге. Думал может есть готовое решение для этого.
Проблема в том, что я планирую предоставлять доступ к уже установленному и настроенному продукту на своем сервере (что-то вроде цмс), где клиенты могут загружать свои темы/шаблоны. include, например, запретить не получится, а при помощи него можно считать все исходники и файлы настроек.

Не в сети

#4 24.08.2015 15:35:49

Re: Запретить шаблонизатору доступ к файлам и функциям

Blade — это не ахти какой парсер, всё что он делает — просто заменяет {{ на <?php и т.п. (условно). Поэтому вы там можете писать любой код и делать в нём любые синтаксические ошибки, Blade это отлично проглотит, а у вас потом будет PHP Fatal Error.

  1. где клиенты могут загружать свои темы/шаблоны.

Если нужно фильтровать код — вам нужен другой парсер. В зависимости от требований его может быть проще написать самому (если не нужны @foreach и прочее). Причём если клиенты у вас не особо программисты, это может быть даже лучше, чем всякие Smarty.

Не в сети

#5 24.08.2015 17:01:37

Re: Запретить шаблонизатору доступ к файлам и функциям

Понял. Значит придется писать свой, на основе blade, так как он уже используется в проекте, а переписывать все шаблоны на другой - затратно.

Не в сети

#6 24.08.2015 17:40:08

Re: Запретить шаблонизатору доступ к файлам и функциям

Мне кажется вам лучше пересмотреть степень настраиваемости приложения. Одно дело — когда клиент может менять отдельно взятые части, это можно рассматривать как public API, которое нужно поддерживать от версии к версии, и другое — когда у вас менять можно любой шаблон, тогда это уже клиент-программист, и ему так же захочется менять классы и т.п. Соответственно, в первом варианте у вас может быть всё то же самое, как сейчас, но если клиент хочет заменить шаблон — вы не даёте ему всех возможностей PHP, Blade и пр., а только ограниченный функционал, который предусмотрен планом.

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

Не в сети

#7 26.08.2015 15:46:09

Re: Запретить шаблонизатору доступ к файлам и функциям

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

Не в сети

Подвал раздела