HtmlPurifier - продолжает удалять мои таблицы - какова правильная конфигурация?

У меня есть таблица, которая постоянно удаляется очистителем html, содержимое - это электронное письмо, которое необходимо заполнить

<table>
<thead>
    <th>fieldA</th>
    <th>fieldB</th>
    <th>fieldC</th>
    <th>fieldD</th>
</thead>
<tbody>
<!--[[[order_list]]]-->     
</tbody>
</table>

куда < ! - - [[[order_list]]] - -> заменяется во время выполнения, но htmlpurifier продолжает удалять мою таблицу (комментарии есть для ckeditor, иначе он будет удален)

Я попытался отключить AutoFormat.RemoveEmpty:

 $config = \HTMLPurifier_Config::createDefault();
 $config->set('AutoFormat.RemoveEmpty', false);
 Validator::$purifier = new \HTMLPurifier($config);
 $val=Validator::$purifier->purify($data);

он вообще не работает, таблица пока удаляется

Как я могу это исправить ?

Благодарность

[edit: пробовал это до сих пор ...]

$config = \HTMLPurifier_Config::createDefault();
//                        $config->set('AutoFormat.RemoveEmpty', false);
// ----------------------------------------------- from stackoverflow
$def = $config->getHtmlDefinition(true);

$element = $def->addElement(
                            'tbody',
                            false,
                            'Flow', // <-- here is the change - we're not requiring 'tr' any more
                            'Common',
                            [
                                'align' => 'Enum#left,center,right,justify,char',
                                'charoff' => 'Length',
                                'valign' => 'Enum#top,middle,bottom,baseline',
                            ]
                        );

$config->set('HTML.AllowedComments', array('[[[[order_list]]]'));

Validator::$purifier = new \HTMLPurifier($config);

person user7082181    schedule 05.09.2019    source источник


Ответы (1)


Проблема, с которой вы столкнулись, заключается в том, что tbody не может быть пустым по стандарту HTML («Каждая группа строк должна содержать хотя бы одну строку») (и большая часть безопасности HTML Purifier проистекает из стратегического требования, чтобы HTML соответствовал стандартам), комментарий не считается содержимым и поэтому удаляется. При этом "живой" стандарт HTML не требует this ("Zero or more tr ..."), так что возиться с ним безопасно.

В любом случае вы можете увидеть требования HTML Purifier в файле library/HTMLPurifier/HTMLModule/Tables.php:

$this->addElement('tbody', false, 'Required: tr', 'Common', $cell_align);

Если вы хотите изменить способ обработки HTML Purifier tbody элементов, ознакомьтесь с документацией Customize. . Ваше решение будет выглядеть примерно так (хотя этот пример не кэширует определение HTML, вы можете возиться со своим, пока это не произойдет с вашим):

require_once (__DIR__ . '/library/HTMLPurifier.auto.php');

$dirty_html = '<table>
<thead>
    <th>fieldA</th>
    <th>fieldB</th>
    <th>fieldC</th>
    <th>fieldD</th>
</thead>
<tbody>
    <!--[[[order_list]]]-->
</tbody>
</table>';

$config = HTMLPurifier_Config::createDefault();

$def = $config->getHtmlDefinition(true);

$element = $def->addElement(
    'tbody',
    false,
    'Flow', // <-- here is the change - we're not requiring 'tr' any more
    'Common',
    [
        'align' => 'Enum#left,center,right,justify,char',
        'charoff' => 'Length',
        'valign' => 'Enum#top,middle,bottom,baseline',
    ]
);

$purifier = new HTMLPurifier($config);
$clean_html = $purifier->purify($dirty_html);

Это выплевывает (хотя я удалил пробелы):

<table><thead></thead><tbody></tbody></table>

Если результат по-прежнему кажется вам неправильным, потому что thead был очищен, знайте, что thead был очищен, потому что в нем есть "случайные" th теги - они не упакованы tr. Этот должен соответствовать стандартам даже "живым" стандартный (поскольку он разрешает только tr детей), но вы, конечно, также можете изменить это поведение, настроив очиститель HTML, если хотите. Это может иметь непредвиденные последствия для рендеринга в браузере, но будьте осторожны!

Тем не менее, одно это по-прежнему убивает комментарий <!-- [[[order_list]]] -->, поскольку HTML Purifier по умолчанию запрещает все комментарии по соображениям безопасности (исторически было довольно много эксплойтов браузера, вытесняющих HTML-комментарии, хотя в последние годы не так много).

Чтобы исправить это, вы можете внести в белый список конкретный комментарий, который хотите сохранить, следующим образом:

...
$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.AllowedComments', ['[[[order_list]]]']);

$def = $config->getHtmlDefinition(true);
...

Это выплюнет (хотя я снова удалил пробелы):

<table><thead></thead><tbody><!--[[[order_list]]]--></tbody></table>
person pinkgothic    schedule 06.09.2019
comment
это своего рода работа, таблица остается, но драгоценный комментарий удаляется ... Я обновил свой вопрос кодом - person user7082181; 13.09.2019
comment
@ user7082181 Чтобы узнать о проблеме с комментарием, см. htmlpurifier.org/live/configdoc/ plain.html # HTML.AllowedComments - попробуйте добавить $config->set('HTML.AllowedComments', ['[[[order_list]]]']); после создания $config - person pinkgothic; 13.09.2019
comment
Я обновил свой вопрос, он не работает, теперь комментарий полностью удален - person user7082181; 13.09.2019
comment
Невозможно установить директиву после вызова завершения в строке 726 в файле ..validator.php - person user7082181; 13.09.2019
comment
Вам действительно нужно поместить его сразу после создания экземпляра $config, как я уже упоминал; если вы разместите его позже, ваша конфигурация уже завершена, потому что она использовалась в определении HTML. Поэтому найдите $config = HTMLPurifier_Config::createDefault(); в своем коде и поставьте сразу после него $config->set('HTML.AllowedComments', ['[[[order_list]]]']);. - person pinkgothic; 13.09.2019
comment
Мне кажется странным, что массив ('[[[[список_порядка]]]') не работает, в то время как ['[[[список_порядка]]]'] работает - person user7082181; 18.09.2019
comment
Первый вариант должен работать, если ваша строка '[[[order_list]]]', а не '[[[[order_list]]]' (обратите внимание на другое количество скобок). - person pinkgothic; 18.09.2019