разрешить синтаксис ветки в htmlpurifier и/или не убирать

я запускаю некоторые шаблоны, которые мои посетители делают с помощью twig через htmlpurifier, но он продолжает пытаться исправить html-код.

у меня это как пример:

<ul>
   {% for update in jobupdates %}
       <li>
          {{ update.comment|nl2br }}
       </li>
   {% endfor %}
</ul>

и это превратится в:

<ul><li>
{% for update in jobupdates %}
</li><li>
    {{ update.comment|nl2br }}
{% endfor %}
</li></ul>

который полностью ломает все это. Я попытался установить для параметра «HTML.TidyLevel» значение none, но он все еще работает.

Есть ли способ остановить htmlpurifier от попыток исправления html-кода? или игнорировать синтаксис ветки?


person PixelPaul    schedule 15.07.2016    source источник


Ответы (1)


Фон

Подходит ли HTML Purifier для работы, которую вы хотите выполнять?

Ваша проблема, по сути, сводится к тому, что HTML Purifier предназначен для очистки HTML, тогда как вы кормите его Twig, языком разметки шаблонов. Он содержит некоторый HTML, но это не то же самое, что являться HTML (так же, как HTML может содержать обычный текст, но это не одно и то же как обычный текст).

Почему это происходит?

Причина, по которой он делает то, что вы наблюдаете, заключается в том, что большая часть силы HTML Purifier в отделе очистки связана со строгостью структуры HTML, который передается ему. Таким образом, эксплойты, которые зависят от деталей реализации в браузерах, выходящих за рамки стандарта (например, в данном случае, как обрабатывать текст в неупорядоченном списке (<ul>), который не является элементом списка< /em> (<li>)) также учитываются, уменьшая поверхность атаки.

В данном конкретном случае вероятность того, что что-то сломается, если разрешить это созвездие, настолько мала, что им можно пренебречь, но можно представить другие созвездия, где это имеет значение (например, представьте, что кто-то пишет <img>some payload here</img> — это не имеет смысла в HTML, и я знаю ни одного эксплойта в дикой природе прямо сейчас, который выглядит примерно так, но можно представить, что браузер пытается с ним поумнеть).

В любом случае, это неотъемлемая часть HTML Purifier, и вы не можете просто отключить его, так как все правила очистки HTML Purifier, по существу, существуют помимо правильно сформированного HTML, для упомянутых причина.

Решения

A: Задайте вопрос по варианту использования

В зависимости от вашего предпоследнего варианта использования очистки, решение может быть таким же простым, как и установка очистки после преобразования вашего шаблона Twig в HTML, но до результат отображается на странице. Это имеет дополнительное преимущество очистки, например. комментарии, которые вводятся в ваш шаблон.

Тем не менее, это может не иметь никакого отношения к тому, чего вы на самом деле надеетесь достичь.

B: Используйте другой инструмент

Если все, что вы хотите сделать, это привести в порядок HTML-код в ваших шаблонах, а не очистить его, вы можете рассмотреть другой инструмент. У меня нет опыта работы с инструментами, которые просто упорядочивают HTML, и у них могут быть те же недостатки (даже простое желание создать правильный HTML будет иметь такой эффект, но, возможно, есть инструменты, которые только отступ теги и исправить очевидные ошибки тегов, например удалить где-то </img>).

Если вы хотите очистить свой HTML-код, вы также можете попробовать другой инструмент. Взгляните на http://htmlpurifier.org/comparison, чтобы найти идеи?

C: Изменить определение HTML Purifier

Вы можете создать форк HTML Purifier и внести изменения в его понимание HTML. На самом деле это возможно только в том случае, если у примера в вашем посте не так много двоюродных братьев, то есть если не так много совершенно разных созвездий, где настойчивость в правильно сформированном HTML мешает. В примере, который вы упомянули, для этого, вероятно, потребуется копаться во внутренностях HTMLPurifier_HTMLModule_List и HTMLPurifier_ChildDef_List, особенно в блоке else в validateChildren() из последнего класса, но прямо сейчас у меня нет под рукой доказательства концепции.

Имейте в виду, что здесь вы, по сути, превращаете определение HTML, с которым работает HTML Purifier, в элементарное определение Twig. Это не только потенциально много работы (в зависимости от того, насколько вы хотите этому учить), но и, вероятно, на самом деле не то, чем вы хотите заниматься.

Вывод

Я бы рекомендовал задать себе несколько вопросов и принять меры на основе ответов (информация в скобках существует как руководство к этим действиям, мысли здесь не исчерпывающие):

  1. Для вас важно иметь чистые шаблоны или чистый вывод? (Если шаблоны, HTML Purifier не может вам помочь, так как он не предназначен для Twig; если вывод, HTML Purifier может вам помочь .)
  2. Вы хотите предотвратить XSS-атаки? (Если да, HTML Purifier может помочь вам, но только после того, как Twig сделает свое дело и создаст HTML для анализа.)
  3. Вы хотите перехватывать недопустимые объявления HTML? (Если вы это сделаете, HTML Purifier снова может вам помочь, но только после того, как Twig сделает свое дело.)
  4. Хотите отловить недопустимые объявления Twig? (Если да, то HTML Purifier не сможет вам помочь — возможно, имеет смысл поискать специальный инструмент проверки Twig.)

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

person pinkgothic    schedule 16.07.2016
comment
это за вашу помощь .... но, как я это вижу ... код ветки следует рассматривать как обычный текст, а не какой-либо код вообще. точно так же, как на стандартной html-странице. И тогда очистку html следует отключить, так как мне она не нужна. и wola, у меня должно все получиться. Но я просто не могу отключить очистку в htmlpurifier. Из документов кажется, что я делаю html tidy, но после того, как я установил значение «none», он все равно пытается исправить html. - person PixelPaul; 17.07.2016
comment
Я согласен с pinkgothic, здесь единственным приемлемым вариантом является использование очистителя после рендера ветки. Я могу вспомнить ситуации, когда шаблон внутри ветки неверен, но после рендеринга это так. - person DarkBee; 17.07.2016