Фильтрация полей с помощью Jevix, когда на сайте используется Fenom
        Если пользователи что-то вводят на сайте, а вы сохраняете эти данные в базу, то при выводе необходимо фильтровать теги, чтобы не допустить, например, XSS-атаки.
С этой задачей прекрасно справляется Jevix. Но только что столкнулся с проблемкой.
На сайте используется Fenom. И если пользователь введет в поле, например
То Jevix спокойно пропустит фигурные скобочки, а Fenom с удовольствием их обработает. Хорошо, когда фигурные скобки можно вырезать из текста при сохранении. А что делать, если их надо сохранить и вывести?
Я пробовал перед тем, как «подсунуть» поле Jevix'у произвести замену на html-коды скобок. Но вы Jevix жестко заложено преобразование спец-символов в сущности.
В результате, Jevix сводит эту замену на «нет». Я решил проблемку копированием сниппета Jevix и добавлением замены прямо в него. Сниппет JevixFenom

Редактор вырезает HTML-коды символов, поэтому последняя строчка картинкой вставлена =))
Может, стоит оформить пулл-реквест Василию? Добавить, например, настройку «Заменять фигурные скобки»… Или вообще проверять настройки системы и, если найден Fenom, включать эту замену принудительно?
А, может быть, кто-то уже решал такую проблему до меня? Вообще есть другой способ ее решения?
    
    
                                                                                
            С этой задачей прекрасно справляется Jevix. Но только что столкнулся с проблемкой.
На сайте используется Fenom. И если пользователь введет в поле, например
{if true}
  It's worked
{else}
  False
{/fi}То Jevix спокойно пропустит фигурные скобочки, а Fenom с удовольствием их обработает. Хорошо, когда фигурные скобки можно вырезать из текста при сохранении. А что делать, если их надо сохранить и вывести?
Я пробовал перед тем, как «подсунуть» поле Jevix'у произвести замену на html-коды скобок. Но вы Jevix жестко заложено преобразование спец-символов в сущности.
В результате, Jevix сводит эту замену на «нет». Я решил проблемку копированием сниппета Jevix и добавлением замены прямо в него. Сниппет JevixFenom
<?php
/** @var array $scriptProperties */
/** @var Jevix $Jevix */
if (!$modx->loadClass('jevix', MODX_CORE_PATH . 'components/jevix/model/jevix/', false, true)) {
	return 'Could not load Jevix!';
}
$Jevix = new Jevix($modx, $scriptProperties);
// После обработки скобки заменяются на html-коды
Редактор вырезает HTML-коды символов, поэтому последняя строчка картинкой вставлена =))
Может, стоит оформить пулл-реквест Василию? Добавить, например, настройку «Заменять фигурные скобки»… Или вообще проверять настройки системы и, если найден Fenom, включать эту замену принудительно?
А, может быть, кто-то уже решал такую проблему до меня? Вообще есть другой способ ее решения?
Комментарии: 26
                Я об этом не подумал, но в очередной раз порадовался, что обработка Fenom тегов не включена везде по умолчанию.
Выпущу обновление Tickets с фильтрацией тегов Fenom в пользовательских документах.
                    Выпущу обновление Tickets с фильтрацией тегов Fenom в пользовательских документах.
                Может, лучше Jevix обновить? Все-таки фильтрация — его дело, да и фильтровать надо не только ресурсы, но и, например, поля пользователя в личных кабинетах…            
                    
                Это типограф.
Почему он должен фильтровать скобочки? Это и раньше делал сам Tickets.
                    Почему он должен фильтровать скобочки? Это и раньше делал сам Tickets.
                Ну он же еще и скрипты вырезает и теги разные нехорошие =)))
Но я не настаиваю.
                    Но я не настаиваю.
                А скобочки не вырезает, они сами по себе ничем не опасны.
Поэтому для MODX их вырезает Tickets.
                    Поэтому для MODX их вырезает Tickets.
                Хотя бы добавить параметр, выключающий преобразование последовательностей в сущности…            
                    
                Вот такой, что ли?
            
                    
            
                Нит) У сниппета добавить параметр htmlEntityDecode, по умолчанию равен true, а если поставить false, Jevix перестанет преобразовывать & #125 в {            
                    
                Еще раз, почему это должен делать типограф?
Именно Tickets позволяет добавлять документы с опасными тегами, именно он их и должен фильтровать.
Уже завтра он так и будет делать, сейчас я просто в гостях.
                    Именно Tickets позволяет добавлять документы с опасными тегами, именно он их и должен фильтровать.
Уже завтра он так и будет делать, сейчас я просто в гостях.
                Вот-вот, зачем типограф это делает? Я хочу отключить этот функционал…            
                    
                Вот-вот, типограф сейчас этого и не делает.
Ну посмотри уже исходники, что ли. Они же не просто так открыты.
                    Ну посмотри уже исходники, что ли. Они же не просто так открыты.
                Я сам щас с телефона))) Вот этот метод как отключить? github.com/bezumkin/modx-jevix/blob/master/core/components/jevix/model/jevix/jevix.core.php#L1312 Зачем он в типографе? =((            
                    
                Не знал, что ты такой нудный, жаль.
Скобочки в html entities не попадают. Это автор Jevix предусмотрел от всяких XSS, а не тегов MODX.
[], {} работают в Jevix без вопросов.
            
                    Скобочки в html entities не попадают. Это автор Jevix предусмотрел от всяких XSS, а не тегов MODX.
[], {} работают в Jevix без вопросов.

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

Если вывести так, то выводится нормально — Fenom не обрабатывает такие скобки
Но я хочу еще и типографить поля этого объекта. Я не стал писать свой сниппет для этого, потому что я наглый и ленивый, а взял существующий — Jevix.
Оп, и теги Fenom стали обрабатываться, потому что Jevix такой добрый заменил
            
                    Вот есть у меня объект, modExtraItem, который пользователи могут добавлять на сайт/редактировать.
Я знаю, что пользователь может ввести скобки, поэтому объект я вывожу таким сниппетом:

Если вывести так, то выводится нормально — Fenom не обрабатывает такие скобки
[[getModExtraItem? &id=`5` &tpl=`tpl.item`]]Но я хочу еще и типографить поля этого объекта. Я не стал писать свой сниппет для этого, потому что я наглый и ленивый, а взял существующий — Jevix.
[[getModExtraItem:Jevix? &id=`5` &tpl=`tpl.item`]]Оп, и теги Fenom стали обрабатываться, потому что Jevix такой добрый заменил
            
                Вообще, я-то свою проблему решил — я не спорю, я только предлагаю. Если разработчик считает, что это правильное поведение, значит, так и есть. У каждого инструмента своя область применения. Так что если ты говоришь, что не надо Jevix менять, значит не надо.            
                    
                То есть, речь о том, что Jevix преобразовывает сущности в нормальные символы, чтобы потом повырезать всякую дрянь?
Ну, чтобы пользователь не смог тупо написать
Может, ленивому разработчику лучше сначала отдавать документ Jevix, а потом уже экранировать всякое опасное, как это делает Tickets?
В общем, ты свою проблему решил, я Tickets обновлю завтра, а остальным разработчикам могу только посоветовать думать, что они делают.
И Jevix, и Fenom, и создание всякого с фронтенда — это всё не работает по умолчанию, нужно включить и использовать самостоятельно.
                    Ну, чтобы пользователь не смог тупо написать
<script>alert()</script>а иначе, все эти проверки обходились бы очень легко.Может, ленивому разработчику лучше сначала отдавать документ Jevix, а потом уже экранировать всякое опасное, как это делает Tickets?
В общем, ты свою проблему решил, я Tickets обновлю завтра, а остальным разработчикам могу только посоветовать думать, что они делают.
И Jevix, и Fenom, и создание всякого с фронтенда — это всё не работает по умолчанию, нужно включить и использовать самостоятельно.
                Василий, я про это писал еще здесь.
                    но все равно где-то дыры будут. Потом где-то регистрацию сделают и человек что-то подобное в своем имени укажет или еще где-то. Проблема тут в том, что откуда бы код не взялся, он в итоге собирается в единое и потом на уровне modResponse отрабатывается как единый шаблон. Это та же проблема, по которой MODX фильтрует MODX-теги в запросах. Вот та же головная боль возникает и здесь. Возможно тут надо подумать немного в другом направлении, как вариант — не отрабатывать все как феном-код на конечном этапе modResponse, хотя это мне и кажется в рамках текущей парадигмы маловероятным.Мы обсуждали тут у себя проблемы безопасности в текущей реализации. Печально, но, скорее всего все-таки придется полностью пересматривать логику его работы.
                И еще раз напоминаю, что речь параметрах, отключенных по умолчанию. Их нужно включить, чтобы получить эти проблемы.
На этом сайте, например, теги Fenom не работают в тикетах, правда?
                    На этом сайте, например, теги Fenom не работают в тикетах, правда?
                Это я помню и это правильно. Но стоит ли включать такую проблему? 
И хорошо, давай не будем о том кто какой риск несет. Другой вопрос: ты усматриваешь возможность пофиксить это проблему?
                    И хорошо, давай не будем о том кто какой риск несет. Другой вопрос: ты усматриваешь возможность пофиксить это проблему?
                Только полностью отключив обработку тегов в теле страницы. Она и отключена, по умолчанию.
Могу убрать и системную настройку, но уверен, что будет очень много недовольных.
                    Могу убрать и системную настройку, но уверен, что будет очень много недовольных.
                Ну да, это понятно. Но интересовало только твое видение возможного решения самой проблемы. Ладно, надеюсь когда-нибудь это решится и ты поделишься опытом.            
                    
                Обновил и Tickets и Jevix. С первым всё понятно — в дополнение к обработке обычных скобок добавились еще и фигурные.
А вот у Jevix теперь есть новый параметр escapeTags, выключенный по умолчанию.
Надеюсь, теперь все будут довольны.
                    А вот у Jevix теперь есть новый параметр escapeTags, выключенный по умолчанию.
[[*content:Jevix=`{"escapeTags":true}`]]Как видно, сниппет заодно научился понимать JSON в $options.Надеюсь, теперь все будут довольны.
                Василий, после обновления вот такая конструкция перестала работать:
                    [[Jevix@content? &input=`[[*content]]` ]]Не подскажешь, чем ее заменить, если не используется Fenom?            
                Да тут ничего не могло сломаться, вроде.
Попробуй некэшированным вызвать.
                    Попробуй некэшированным вызвать.
                Спасибо!!! Так работает!            
                    
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.