Фильтрация полей с помощью 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?
Да тут ничего не могло сломаться, вроде.
Попробуй некэшированным вызвать.
Попробуй некэшированным вызвать.
Спасибо!!! Так работает!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.