Фильтрация полей с помощью Jevix, когда на сайте используется Fenom

Если пользователи что-то вводят на сайте, а вы сохраняете эти данные в базу, то при выводе необходимо фильтровать теги, чтобы не допустить, например, XSS-атаки.

С этой задачей прекрасно справляется 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, включать эту замену принудительно?

А, может быть, кто-то уже решал такую проблему до меня? Вообще есть другой способ ее решения?
Илья Уткин
12 декабря 2015, 12:41
modx.pro
1
3 471
+6

Комментарии: 26

Василий Наумкин
12 декабря 2015, 16:23
0
Я об этом не подумал, но в очередной раз порадовался, что обработка Fenom тегов не включена везде по умолчанию.

Выпущу обновление Tickets с фильтрацией тегов Fenom в пользовательских документах.
    Илья Уткин
    12 декабря 2015, 17:00
    0
    Может, лучше Jevix обновить? Все-таки фильтрация — его дело, да и фильтровать надо не только ресурсы, но и, например, поля пользователя в личных кабинетах…
      Василий Наумкин
      12 декабря 2015, 17:03
      0
      Это типограф.

      Почему он должен фильтровать скобочки? Это и раньше делал сам Tickets.
        Илья Уткин
        12 декабря 2015, 17:13
        0
        Ну он же еще и скрипты вырезает и теги разные нехорошие =)))

        Но я не настаиваю.
          Василий Наумкин
          12 декабря 2015, 17:20
          0
          А скобочки не вырезает, они сами по себе ничем не опасны.

          Поэтому для MODX их вырезает Tickets.
            Илья Уткин
            12 декабря 2015, 17:24
            0
            Хотя бы добавить параметр, выключающий преобразование последовательностей в сущности…
              Василий Наумкин
              12 декабря 2015, 17:33
              0
              Вот такой, что ли?
                Илья Уткин
                12 декабря 2015, 17:40
                0
                Нит) У сниппета добавить параметр htmlEntityDecode, по умолчанию равен true, а если поставить false, Jevix перестанет преобразовывать & #125 в {
                  Василий Наумкин
                  12 декабря 2015, 17:41
                  0
                  Еще раз, почему это должен делать типограф?

                  Именно Tickets позволяет добавлять документы с опасными тегами, именно он их и должен фильтровать.

                  Уже завтра он так и будет делать, сейчас я просто в гостях.
                    Илья Уткин
                    12 декабря 2015, 17:43
                    0
                    Вот-вот, зачем типограф это делает? Я хочу отключить этот функционал…
                      Василий Наумкин
                      12 декабря 2015, 17:45
                      0
                      Вот-вот, типограф сейчас этого и не делает.

                      Ну посмотри уже исходники, что ли. Они же не просто так открыты.
                      Илья Уткин
                      12 декабря 2015, 17:54
                      0
                      Я сам щас с телефона))) Вот этот метод как отключить? github.com/bezumkin/modx-jevix/blob/master/core/components/jevix/model/jevix/jevix.core.php#L1312 Зачем он в типографе? =((
                      Василий Наумкин
                      12 декабря 2015, 17:57
                      0
                      Не знал, что ты такой нудный, жаль.

                      Скобочки в html entities не попадают. Это автор Jevix предусмотрел от всяких XSS, а не тегов MODX.

                      [], {} работают в Jevix без вопросов.
                      Илья Уткин
                      12 декабря 2015, 18:14
                      0

                      А мне хочется, чтобы выводились именно кодом, а не преобразовывались в символы
                      Илья Уткин
                      12 декабря 2015, 19:46
                      0
                      Щас подробнее распишу.

                      Вот есть у меня объект, modExtraItem, который пользователи могут добавлять на сайт/редактировать.

                      Я знаю, что пользователь может ввести скобки, поэтому объект я вывожу таким сниппетом:



                      Если вывести так, то выводится нормально — Fenom не обрабатывает такие скобки
                      [[getModExtraItem? &id=`5` &tpl=`tpl.item`]]

                      Но я хочу еще и типографить поля этого объекта. Я не стал писать свой сниппет для этого, потому что я наглый и ленивый, а взял существующий — Jevix.
                      [[getModExtraItem:Jevix? &id=`5` &tpl=`tpl.item`]]

                      Оп, и теги Fenom стали обрабатываться, потому что Jevix такой добрый заменил
                      Илья Уткин
                      12 декабря 2015, 19:49
                      0
                      Вообще, я-то свою проблему решил — я не спорю, я только предлагаю. Если разработчик считает, что это правильное поведение, значит, так и есть. У каждого инструмента своя область применения. Так что если ты говоришь, что не надо Jevix менять, значит не надо.
                      Василий Наумкин
                      12 декабря 2015, 20:21
                      1
                      0
                      То есть, речь о том, что Jevix преобразовывает сущности в нормальные символы, чтобы потом повырезать всякую дрянь?

                      Ну, чтобы пользователь не смог тупо написать
                      &lt;script&gt;alert()&lt;/script&gt;
                      а иначе, все эти проверки обходились бы очень легко.

                      Может, ленивому разработчику лучше сначала отдавать документ Jevix, а потом уже экранировать всякое опасное, как это делает Tickets?

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

                      И Jevix, и Fenom, и создание всякого с фронтенда — это всё не работает по умолчанию, нужно включить и использовать самостоятельно.
    Fi1osof
    12 декабря 2015, 17:38
    0
    Василий, я про это писал еще здесь.
    но все равно где-то дыры будут. Потом где-то регистрацию сделают и человек что-то подобное в своем имени укажет или еще где-то. Проблема тут в том, что откуда бы код не взялся, он в итоге собирается в единое и потом на уровне modResponse отрабатывается как единый шаблон. Это та же проблема, по которой MODX фильтрует MODX-теги в запросах. Вот та же головная боль возникает и здесь. Возможно тут надо подумать немного в другом направлении, как вариант — не отрабатывать все как феном-код на конечном этапе modResponse, хотя это мне и кажется в рамках текущей парадигмы маловероятным.
    Мы обсуждали тут у себя проблемы безопасности в текущей реализации. Печально, но, скорее всего все-таки придется полностью пересматривать логику его работы.
      Василий Наумкин
      12 декабря 2015, 17:40
      0
      И еще раз напоминаю, что речь параметрах, отключенных по умолчанию. Их нужно включить, чтобы получить эти проблемы.

      На этом сайте, например, теги Fenom не работают в тикетах, правда?
        Fi1osof
        12 декабря 2015, 17:46
        0
        Это я помню и это правильно. Но стоит ли включать такую проблему?
        И хорошо, давай не будем о том кто какой риск несет. Другой вопрос: ты усматриваешь возможность пофиксить это проблему?
          Василий Наумкин
          12 декабря 2015, 17:47
          +1
          Только полностью отключив обработку тегов в теле страницы. Она и отключена, по умолчанию.

          Могу убрать и системную настройку, но уверен, что будет очень много недовольных.
            Fi1osof
            12 декабря 2015, 17:52
            0
            Ну да, это понятно. Но интересовало только твое видение возможного решения самой проблемы. Ладно, надеюсь когда-нибудь это решится и ты поделишься опытом.
    Василий Наумкин
    13 декабря 2015, 06:57
    +6
    Обновил и Tickets и Jevix. С первым всё понятно — в дополнение к обработке обычных скобок добавились еще и фигурные.

    А вот у Jevix теперь есть новый параметр escapeTags, выключенный по умолчанию.
    [[*content:Jevix=`{"escapeTags":true}`]]
    Как видно, сниппет заодно научился понимать JSON в $options.

    Надеюсь, теперь все будут довольны.
      Александр Наумов
      24 марта 2016, 18:41
      0
      Василий, после обновления вот такая конструкция перестала работать:
      [[Jevix@content? &input=`[[*content]]` ]]
      Не подскажешь, чем ее заменить, если не используется Fenom?
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    26