xmlfilter - модуль для фильтрации XML-документов

Popoff

popoff.donetsk.ua
xmlfilter - модуль для фильтрации XML-документов

Вот, забацал прибамбас для фильтрации xml-документов:
http://popoff.donetsk.ua/text/work/libs/xmlfilter/
может, кому будет интересно :)
Основные возможности:

по умолчанию все теги запрещены. Можно задать список разрешенных тегов. Для каждого тега мы можем указывать параметры, как должна вести себя система в случае, если пользователь вводит недопустимый тег, указывает недопустимый атрибут или недопустимое значение одного из атрибутов, или располагает тег в месте, где этот тег не может быть расположен.

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

по умолчанию во всех тегах все атрибуты запрещены. Можно задать список разрешенных атрибутов для каждого отдельного тега. Для каждого отдельного атрибута можно указать, какие значения считать допустимыми в качестве значения этого атрибута.

по умолчанию запрещены все специальные символы, кроме символов <, >, & и ". Можно задать список разрешенных специальных символов. Например, можно дополнительно разрешить специальный символ неразрывного пробела  .

В случае возникновения ошибок система не просто запрещает все неправильные данные, но она так же пишет, почему она запретила эти данные. Можно задавать, кто будет видеть сообщения об ошибках, а кто - нет.

Систему можно настроить таким образом, что бы результатом обработки всегда был валидный html. Это необходимо для того, что бы нельзя было ввести такой html-код, который мог бы испортить содержимое всей страницы. Например, нельзя выводить тег <tr>, если он расположен не внутри тега <table>.

Система может преобразовывать документы в двух режимах: в режиме xml и в текстовом режиме.

Дополнительные возможности для пользователей - переход на новую строку может автоматически преобразовываться в тег <br />. Возможно автоматическое преобразование смайлов.

О дополнительных возможностях по расширению системы (для программистов). Можно добавлять свои процедуры проверки правильности значений атрибутов, обработки инструкций, специальной обработки тегов и особой проверки валидности и преобразования URL. Можно так же задавать свой собственный перечень смайлов.
 

ONK

Пассивист PHPСluba
Popoff, как это похоже на мой фильтр html кода. :)

Только то, что здесь описано, на сколько я понял, это не фильтр, а скорее просто валидатор. Фильтр должен поддерживать правильное уничтожение всех недопустимых тэгов.

-~{}~ 22.08.05 23:29:

ПС <td> действительно имеет право быть не закрытым и это не ошибка.
 

Popoff

popoff.donetsk.ua
Фильтр должен поддерживать правильное уничтожение всех недопустимых тэгов.
для всех недопустимых тегов можно указывать, как будет вести себя система: запрещать, удалять оставляя содержимое или удалять вместе со всем вложенным содержимым.
 

slach

Новичок
а чем это принципиально отличается от DTD и XMLSchema ??

IMHO
$dom->loadHTML($html)
$dom->schemaValidate('myshema.xsd');

както более приятны глазу... хотя наверное у вас более гибкая система обработки ошибок тут только valid \ non valid статусы
 

ONK

Пассивист PHPСluba
Popoff, тогда этот совсем похоже на мой фильтр. А может ли он грамотно таблицы фильтровать?
 

dvp

Новичок
Мда ....... ещё бы визуальный редактор для ввода данных, соответствующих заданной схеме, тогда это было бы действительно нужно, а так DTD и XMLSchema вполне справляются с поставленной задачей
 

ONK

Пассивист PHPСluba
dvp, с визуальным редактором есть проблемы, разные браузера по разному генерируют html код. FF например предпочитает делать форматирование через CSS (атрибут style="..."). А атрибут style очень опасная штука чтобы его разрешать и одновременно имеет достаточно сложный синтаксис, чтобы его можно было легко валидировать.
Поэтому согласовывать визуальный редактор с правилами фильтрования не реально, проще либо разрешить, либо запретить визуальный режим.
Я собираюсь писать отдельный фильтр на style атрибут.
 

Popoff

popoff.donetsk.ua
ONK
да, для этого в моей системе можно указывать, какие теги допустимы внутри данного, и внутри каких допустим данный тег. Если запрещенным оказывается родительский тег, то запрещаются так же и все дочерние теги.

Вообще, обо всех настройках написано здесь:
http://popoff.donetsk.ua/text/work/libs/xmlfilter/parse/param.html

-~{}~ 24.08.05 13:37:

запрещаются все дочерние - в смысле только те, которые зависят от родительского :)
 

ONK

Пассивист PHPСluba
Понятно, у меня контролируется уровень вложенности блочных тегов, уровень вложенности одинаковых блочных тегов + контролируется допустимость структуры таблиц.

Как я понял, у тебя такой кусок будет признан корректным? <table>tttt</table>
 

Popoff

popoff.donetsk.ua
[offtop]
ПС <td> действительно имеет право быть не закрытым и это не ошибка.
Что считать ошибкой?
http://popoff.donetsk.ua/text/work/prg/error.html
[/offtop]

у меня контролируется уровень вложенности блочных тегов, уровень вложенности одинаковых блочных тегов
что это значит? Если не говорить об отдельном контроле конкретно для структуры таблиц, то я могу написать так:
<table></table>
<p><tr></tr></p>
уровень правильный - table - на первом уровне, tr - на втором?

Как я понял, у тебя такой кусок будет признан корректным? <table>tttt</table>
Да. Это, конечно, не доработка и при возможности будет исправлена. У меня описано, в связи с чем в данном варианте реализации фильтра эту особенность можно считать проблемой: Если я напишу так:
<table><tr><td>qwe</td></tr>asd</table>, то при встрече "asd" я должен буду возвращаться и запрещать разрешенные ранее теги tr и td. Как вариант, я мог бы конечно просто удалить "asd", но у меня везде ведется такая политика, что ничего само не удаляется - само удаляется только если это явно указано в настройках. Да и эти настройки мне кажутся ненужной вольностью - все неправильное должно быть отображено "как есть", как при использовании простого htmlspecialchars. Я позволил себе оставить пока эту проблему нерешенной, потому что такого типа ошибки неправильно отображаются только внутри того блока, в котором находится это сообщение. Это в отличие от ошибки, когда мы разрешили бы тег tr без внешнего тега table - от этого поплыла бы вся страница.
 

ONK

Пассивист PHPСluba
Popoff, странно, но я не видел браузеров, которые бы не корректно обрабатывали не закрытые <td> и <tr>. Всё-таки это стандарт.

Контроль уровня вложенности для блочных тегов я ввёл для предотвращения деформации страницы от злостного их применения, а контроль вложенности одинаковых тегов для убирания лишних и подозрительных конструкций <b>текст <b>ещё текст</b> и ещё</b> <a ...><a....>ссылка непонятно куда</a></a>.

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

Popoff

popoff.donetsk.ua
ONK
странно, но я не видел браузеров, которые бы не корректно обрабатывали не закрытые <td> и <tr>. Всё-таки это стандарт.
в старых версиях NN такие таблицы неправильно отображаются. по крайней мере мне так помнится - это был один из моих самых первых проектов и я помню, что с таблицами там был большой глюк не только с незакрытыми тегами, но и с пустым содержимым: таблицы наезжали одна на другую, вылазили за пределы экрана и т.п. :)

а контроль вложенности одинаковых тегов для убирания лишних и подозрительных конструкций <b>текст <b>ещё текст</b> и ещё</b> <a ...><a....>ссылка непонятно куда</a></a>.
у меня для этого есть настройка, позволяющая запретить тег, если один из родителей - содержится в списке запрещенных тегов. вчера добавил, описание еще не выложил :)
Структура таблиц у меня контролируется отдельно, в соответствии со стандартами, так, чтобы в любом случае было невозможно испортить структуру html документа.
у меня таблицы контролируются в общем случае, так же, как и все остальное. "общий случай" означает, что все ограничения, которые мы применяем для таблиц, можно применить так же и для любых других тегов - зачем ограничивать и делать проверку только для таблиц?

настройку, что бы вложенный текст внутри <table>rrr</table> удалялся, я вчера добавил, но в целом я с ней не согласен - буду мыслить дальше.

Контроль уровня вложенности для блочных тегов я ввёл для предотвращения деформации страницы от злостного их применения,
хм.. :) страницу можно деформировать не только злостным применением блочных тегов. Можно еще вот так:
http://phpclub.ru/talk/showthread.php?postid=510208#post510208

контроль вложенности одинаковых тегов для убирания лишних и подозрительных конструкций <b>текст <b>ещё текст</b> и ещё</b> <a ...><a....>ссылка непонятно куда</a></a>.
а если я напишу так: <a><b><a>ссылка непонятно куда</a></b></a> - это будет признано неправильным? а если так: <ul><li><ul><li>qqq</li></ul></li></ul>?
 

ONK

Пассивист PHPСluba
настройку, что бы вложенный текст внутри <table>rrr</table> удалялся, я вчера добавил, но в целом я с ней не согласен - буду мыслить дальше.
В данном случае мой фильтр удалит не содержание (rrr) а недопустимые теги (<table> и </table>). Мой фильтр в принципе не фильтрует текст вне тегов, даже если его там не должно быть (как в случае с таблицами), это не его задача. Задача фильтра исключить внедрение в документ несанкционированного html кода. Текст вне тегов у меня фильтруется отдельно.

хм.. страницу можно деформировать не только злостным применением блочных тегов. Можно еще вот так:
http://phpclub.ru/talk/showthread.p...0208#post510208
подобные банальности предотвращаются другими способами, я использую разрыв картинкой с прозрачным пикселом, в отличие от пробела, это работает в любой комбинации символов и одинаково во всех браузерах.

<a><b><a>ссылка непонятно куда</a></b></a>
Если первый <a> будет иметь допустимый формат, то 2-й <a> будет удалён, <b> останется в любом случае.

<ul><li><ul><li>qqq</li></ul></li></ul>
Я допускаю 10 уровневую вложенность для таких тегов.
 

Popoff

popoff.donetsk.ua
slach
а чем это принципиально отличается от DTD и XMLSchema ??

IMHO
$dom->loadHTML($html)
$dom->schemaValidate('myshema.xsd');

както более приятны глазу... хотя наверное у вас более гибкая система обработки ошибок тут только valid \ non valid статусы
Чем эта библиотека принципиально отличается от DTD и XMLSchema?
http://popoff.donetsk.ua/text/work/libs/xmlfilter/faq/std.html

Спасибо за вопрос!

-~{}~ 26.08.05 20:47:

ONK
Я все же добил его - теперь у меня тег table запрещается, если внутри расположено что-нибудь недопустимое. Там, конечно, мороки, запоминаются состояния а потом в случае ошибок делаются откаты. Зато прикольно :)
 

ONK

Пассивист PHPСluba
Popoff, поздравляю, это самое сложное в валидации HTML. :)
 

dvp

Новичок
И всё-таки это будет не востребовано.
Как мне кажется сейчас остро стоит вопрос о возможности ввода (X)HTML информации неподготовленными пользователями. Т.е. теми, кто вообще понятия о тегах не имеет.

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

А если бы это ещё было сделано на ActiveX или Java и выдавало бы валидный XHTML (или его фрагмент), то этому вообще цены бы не было.
 

ONK

Пассивист PHPСluba
dvp, то, о чём ты говориш решается применением связки полнофункционального визуального редактора на стороне клиента и фильтра html кода на стороне сервера. Пользователю не надо ничего знать о html тегах.
 

Popoff

popoff.donetsk.ua
ONK
Я собираюсь писать отдельный фильтр на style атрибут.
Ты уже начал? Мне пока придумалось по той же схеме, что и в фильтре html - список разрешенных свойств и для каждого свойства - фильтр для значений. В целом, фильтр на значения свойств в style мало отличается от фильтра на значения атрибутов тегов - можно применить тот же. Сложностей, вроде как, никаких нету..
 

ONK

Пассивист PHPСluba
Popoff, сейчас у меня завал, думаю, что через месяц займусь им. Сам фильтр значительно проще (т.к. правила формирования значения атрибута style достаточно жесткие). Но тут есть одна тонкость, которую надо изучить перед принятием решения как с ней бороться... А общий принцип тот же, список разрешенных свойств, правила валидации значения каждого свойства, не допустимые свойства и значения удаляются.
 
Сверху