Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> реализация безопасного eval 
V
    Опции темы
taral
Дата 5.1.2012, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



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

<b>{$title}</b>
{foreach $names as $name}
    {$name}
{/foreach}

Регулярными выражениями выделяю код что между foreach повторяю его пока не закончится массив $names и заменяю через strtr {$name} на значение переменной текущей итерации цикла. С {$title} тоже только без цикла.

Но хочется немного больше возможностей. К примеру базовая работа с if else, получение свойств обьектов, возможность перебора не просто переменной, а результата выполнения метода обьекта ( {foreach$post->getUsers() as $user} ).

Вообщем это все что хотелось бы. Возможно у кого то будут идеи. Поскольку реализовывать этот функционал тем способом что я выбрал долго и сложно. Может есть какие то библиотеки реализующие подобный функционал.
PM MAIL   Вверх
ksnk
Дата 5.1.2012, 15:20 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 1
Всего: 386



taral, А почему не взять готовые шаблонизаторы? Twig, например. Или еще какие с тем-же Django-template синтаксисом. Можно даже  смарти, если отключить возможность вставлять php вставки.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Absinthe
Дата 5.1.2012, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 4.5.2011

Репутация: 1
Всего: 11



taral, я думаю, что нужно тебе обратиться к человеку с опытом. Потому что чувствую, что тебя XSS ждет smile
PM MAIL   Вверх
taral
Дата 5.1.2012, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



Код

taral, я думаю, что нужно тебе обратиться к человеку с опытом. Потому что чувствую, что тебя XSS ждет

Спасибо за совет. Опыта у меня хватает. И защиту от XSS я сделал в первую очередь.
Цитата

taral, А почему не взять готовые шаблонизаторы? Twig, например. Или еще какие с тем-же Django-template синтаксисом. Можно даже  смарти, если отключить возможность вставлять php вставки. 

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

{% for item in navigation %}

Выведет ошибку, поскольку закрывающего тега нету.
Мне же нужен более продвинутый аналог strtr('template text', array('{{name}}'=>'user name', '{{city}}'=>'город...'));

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

Это сообщение отредактировал(а) taral - 5.1.2012, 23:16
PM MAIL   Вверх
ksnk
Дата 5.1.2012, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 1
Всего: 386



Цитата(taral @  5.1.2012,  18:47 Найти цитируемый пост)
Выведет ошибку, поскольку закрывающего тега нету.

twig позволяет перехватывать ошибки компиляции шаблона и обработать их как нужно.

Цитата(taral @  5.1.2012,  18:47 Найти цитируемый пост)
 А некоторый функционал вообще не должен присутствовать. К примеру include.
Как его отключить в Twig через конфиг я не нашел.

Вероятно, можно решить проблему через переопределение Lexer'a. Или переопределить функции include, extends и какие там еще, так, чтобы они выбрасывали перехватываемую ошибку компиляции.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
actuator
Дата 6.1.2012, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 15.12.2011

Репутация: нет
Всего: 3



Цитата(taral @  5.1.2012,  18:47 Найти цитируемый пост)
В целом причина в том что мне не нужен весь функционал который предоставляют те шаблонизаторы. А некоторый функционал вообще не должен присутствовать. К примеру include.
Как его отключить в Twig через конфиг я не нашел.

Используй расширение sandbox, оно как раз под твою задачу - ограничить доступ к функциональности при помощи белых списков.
PM MAIL   Вверх
taral
Дата 6.1.2012, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



Цитата

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

Огромное спасибо. Это отличное решение!

Добавлено через 6 минут и 37 секунд
actuator а вы не знаете, можно ли настроить Twig таким образом что бы он полностью игнорировал все ошибки шаблона. Я вижу что ошибку несуществующей переменной он игнорирует по умолчанию. Но есть еще запрос к не существующим методам обьектов, не закрытые блоки if и т.д.
PM MAIL   Вверх
actuator
Дата 6.1.2012, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 15.12.2011

Репутация: нет
Всего: 3



Все ошибки игнорировать не получится, нарушения базового синтаксиса будут ронять парсер всегда. С не закрытыми блоками чуть проще - им на вход подается поток токенов, так что можно реагировать на закрытие внешних блоков, но это потребует понимания как блоки писать. Но в TWIG почти все ошибки отслеживаются на этапе компиляции, вызывая исключения, и схватить фатальную ошибку при использовании готового шаблона - это ещё надо постараться, в отличие от Smarty. Обращения к несуществующим методам, по-моему, игнорируются и так (для TWIG это тоже переменные, решение о вызове метода или возврате переменной принимается при выполнении).
PM MAIL   Вверх
taral
Дата 6.1.2012, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 17.1.2008

Репутация: нет
Всего: нет



Цитата

Все ошибки игнорировать не получится, нарушения базового синтаксиса будут ронять парсер всегда.

Вообщем это одна из главных причин почему я начал реализовывать это своим способом типа разбора текста регулярками. Это проигнорирует любой код в шаблоне который нельзя распарсить. Впрочем возможности что предоставляет функционал Twig мне очень понравились. Так что буду использовать его.
PM MAIL   Вверх
Wowa
Дата 11.2.2013, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



В своё время перед до мной стояла такая же задача. Выбрал Twig и доволен.
PM WWW   Вверх
Тигер
Дата 23.7.2013, 06:49 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2010

Репутация: нет
Всего: нет



по моему написать свой шаблонизатор быстрее, чем разбираться с готовым.
В свое время написал с десяток различных шаблонизаторов.
Ps. Как перехватывать фатальные ошибки http://dklab.ru/chicken/nablas/45.html
PM MAIL   Вверх
krundetz
Дата 23.7.2013, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 1
Всего: 69



Цитата(Тигер @  23.7.2013,  06:49 Найти цитируемый пост)
по моему написать свой шаблонизатор быстрее, чем разбираться с готовым.

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

Если брать Twig или Smarty то вы быстрее изучите их чем повторите их функционал. 

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


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
Wowa
Дата 23.7.2013, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(Тигер @  23.7.2013,  05:49 Найти цитируемый пост)
по моему написать свой шаблонизатор быстрее, чем разбираться с готовым.

сейчас есть очень хорошие шаблонизаторы с адекватной лицезией, поэтому писать свой смысла нет (разве что в образовательных целях).
PM WWW   Вверх
krundetz
Дата 23.7.2013, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 1
Всего: 69



Цитата(Wowa @  23.7.2013,  11:52 Найти цитируемый пост)
писать свой смысла нет (разве что в образовательных целях). 

смысл есть, вопрос в том, что ответ для чего это делается точно не должен быть таким:
Цитата(Тигер @  23.7.2013,  06:49 Найти цитируемый пост)
написать свой шаблонизатор быстрее, чем разбираться с готовым


Приемлемыми могут быть:
Уперлись в быстродействие существующих решений,
Уперлись в масштабируемость существующих решений,
Слишком громоздкая структура существующих решений, 
и т.д и т.п. То есть причина должна быть реальной, а не голословной.

Это сообщение отредактировал(а) krundetz - 23.7.2013, 13:39


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0654 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.