Qevix — Jevix-подобный автоматический фильтр HTML/XHTML разметки в текстах пользователей

Применяя наборы правил, контролирует перечень допустимых тегов и атрибутов, предотвращает возможные XSS-атаки.
Qevix основывается на идеях и исходном коде PHP версии Jevix (средства для фильтрации HTML/XHTML разметки и автоматического типографирования текста).
Привет, меня зовут Александр и я здесь, что бы дать вам возможность отказаться от Jevix.
Жаль, что Jevix не развивается и не поддерживается даже сообществом, которое его использует. Я долгое время использовал Jevix входящий в состав LiveStreet для своих проектов, хоть он и был немного доработан, но все же в нем оставался рад неприятных проблем.
Мне не нравилось:
- Что парсер вырезает тег BR из моих CODE. Довольно неприятная ситуация если нужно размещать HTML код в посте;
- Два раза преобразовывались спец. символы в HTML-сущности в атрибутах тегов;
- Невероятно жадная подсветка ссылок, забирала в себя знаки пунктуации после ссылки, из-за чего ссылки получались битыми;
- Невозможность заключать ссылки в кавычки или скобки из-за предыдущего пункта;
- Не верное определение символов новой строки при их пропуске. Под символом новой строки понимались и \n и \r. В связи с чем, если на входе путаница с переводами строк, то и на выходе корректной расстановки тегов BR не получалось.
Я ещё не учитываю официальную PHP версию, в которой нет некоторых полезных конфигов, таких как полный callback тега и пропуск символов новой строки после блочных тегов.
Уже около года я использую Qevix в своих проектах и могу полагать, что он достиг некоторой зрелости. Я постарался сохранить стилистику конфигурации, как и в оригинальной версии, но с добавлением некоторых новых возможностей.
Что нового:
- Можно напечатать тег BR в CODE. Что довольно важно, если требуется публиковать HTML код;
- Ссылки можно заключать в скобки и двойные кавычки, а так же могут быть завершены знаком пунктуации;
- Нормализация символов перевода строки на входе и возможность установить то, что хотим получить на выходе;
- Новая настройка cfgSetTagBlockType указывает, после каких тегов стоит пропустить один перевод строки, например, это могут быть блочные теги. Она есть в LiveStreet, но отсутствует в официальной PHP версии Jevix;
- Новая настройка cfgSetTagGlobal указывает, какие теги не должны быть дочерними к другим тегам. Например, для тега CUT это может быть очень полезно;
- Новая настройка cfgSetTagBuildCallback устанавливает на тег callback-функцию для ручной сборки тега. Это аналог cfgSetTagCallbackFull из LiveStreet. Функция получает 3 параметра: название тега, массив с атрибутами тега и содержимое тега. Например, можно разрешить пользователям использовать только тег CODE, а на выходе собирать PRE CODE;
- Новая настройка cfgSetTagEventCallback устанавливает на тег callback-функцию для сбора информации. В отличие от callback-функций, установленных с помощью cfgSetTagBuildCallback, этот обработчик не вносит изменения в текст, а может быть использован для сбора какой-либо информации об используемых тегах. Например, можно посчитать, какое количество изображений в тексте, есть ли они вообще, и сформировать массив из их URL для последующего использования, скажем, в meta-описании станицы;
- Новая настройка cfgSetSpecialCharCallback устанавливает на строку, предваренную спец. символом callback-функцию. По умолчанию Qevix работает с тремя спец. символами #, @, $. Как можно догадаться, эта настройка позволяет получить хештег (#hashtag) или имя пользователя (@username), или ключевое слово ($keyword) и оформить его в виде ссылки или того, что вам нужно. Подробнее об этом в документации.
- В Qevix сохранена только часть типографии Jevix. В Qevix нет понятия русский или латинский алфавит, есть служебные и просто печатные символы. Поэтому нельзя сказать, что этот продукт только для русскоязычных текстов. Qevix следит только за дефисами, кавычками, HTML мнемониками, может подсвечивать ссылки и устанавливать переводы строки.
Благодарю за внимание, надеюсь кому-нибудь Qevix послужит хорошую службу. Пример работы и конфигурации вы можете посмотреть в README на GitHub.
GitHub: github.com/AlexanderGrom/Qevix
Документация: github.com/AlexanderGrom/Qevix/blob/master/DOCUMENTATION.md
README: github.com/AlexanderGrom/Qevix/blob/master/README.md
Лицензия MIT.
38 комментариев
github.com/livestreet/livestreet/issues/295
github.com/livestreet/livestreet/issues/10
Второе с автозаменами, я их исключил вообще. Я не всю типографику сохранил, в первую очередь нужно фильтровать теги.
github.com/livestreet/livestreet-framework/issues/62
Если вы пишете про суто системный продукт, не для обычного пользователя, а для технарей, то очень важно рассказать про устройство. В данном случае код основан на Jevixе? Это все тот же конечный автомат?Уже посмотрел, да, это он.Кстати, я вижу что он полностью построен на Жевиксе, только переформатирован и приупорядочен немного, но вот никаких упоминаний в коде об этом не нашел.
А вообще — в Jevix вносилось очень много правок как по безопасности так и настройке, например, разрешенных протоколов. Плюс, парсер — это очень, очень важная часть цмс, если в ней будут бреши, то весь сайт взломать — дело техники. Поэтому вот так просто перескочить на новый парсер без его тестирования — верх легкомыслия, тем более что преимущества, описываемые в топике, есть только относительно «чистого» Жевикса, а в лс он уже значительно допилен и имеет большую часть того, что вы описываете. Плюс Жевикс проверен временем и используется много где, например, на том же Хабре.
Вот я о чем выше — в лс это есть.
Вот я выше все о том же.
«Ваши проекты» не означают отсутствие проблем в безопасности, например, если на них публиковать контент может только админ. А на лс много сайтов и проверить на прочность парсер есть желающие.
Плюс вы новичок (чистый аккаунт даже на гите) и к вам, естественно, будет некоторая доля недоверия т.к. в коде может быть допущена в определенных комбинациях тегов/атрибутов ошибка что приведет к проблемам в безопасности и в новой лс, которую так долго делали, будет такая дыра, если его туда принять.
Честно и открыто расписал. Поэтому я против замены парсера в лс.
З.Ы. Я знаю что я консерватор и иногда ретроград, но во многих ситуациях как и в этой — это здравый смысл.
Я не призываю сесть и заменить парсер. Я дал возможность выбора. Я же не сделал порт для быстрой замены, в надежде поймать новичков. Кто грамотен и хочет попробовать, пожалуйста.
Насчет похожести. Идея та же. Нужен детальный осмотр.
Под своими проектами я имел ввиду и свою работу. Я был бы рад, если нашлись желающие проверить его на прочность.
По поводу конечного автомата. Не могу сказать, что это конечный автомат, тут не используются состояния, больше похоже на перебор символьного массива с некоторыми условиями. Я и про Jevix не могу сказать, что это прям идеальный конечный автомат, хоть там и есть пара состояний.
Я писал, что долгое время использовал Jevix из состава LiveStreet и упомянул о некоторых доработках. Там их не так много.
Нет, там как раз Jevix, который хорошо порефакторили и исправили, но это он. Не хотите же вы сказать что тот весь код вы написали сами?
Но вы не говорите где это используется, снова какая-то анонимизация.
И вот именно это опасно — о вас ничего не известно, где используется — тоже, аккаунт новый и нулевой. Зачем секретничать если вам нечего скрывать?
Все это я к тому — если вы не преследуете нехорошие цели — вы можете дать больше информации. Никто не будет использовать неизвестно что от неизвестно кого, что проверено где-то на неизвестных проектах, которые известны лишь неизвестному автору ).
Опять на счет похожести. Это как кабачок и баклажан. Разумеется я использовал Jevix, дописывал его, изучил его вдоль и поперек, знал каждую строчку. В итоге мне очень нравилась идея и очень не нравилась реализация.
1. Классификация символов — хорошая идея.
2. Рекурсивный перебор символьного массива с запоминанием позиции — хорошая идея.
Что тут можно придумать нового, если я уже так подружился с этим кодом и проникся им.
Да и другим людям мароки меньше, кто знаком в Jevix, тому будет не проблема разобраться. По этому целенаправленно придумывать другой подход и изобретать синтаксический анализатор нет смысла.
Кстати на счет Хабра. Вот у них у же давно не тот Jevix и всех его проблем у них нет. При разработке я сравнивал свой вывод с выдачей Хабра на предмет тех и ли иных нюансов.
У хабра Jevix на перле, который они дописывают и который все ещё поддерживается.
Вот Вы пишите:
Противоречите себе?
…
Конечно можно бесконечно обсуждать, что Qevix это копия Jevix и отличаются они одной буквой, а я подозрительная личность… но я ожидаю чего-то более конструктивного.
Сколько за последние 7 лет? Если открыть 2 окна с голым Jevix и JLS, можно найти только добавление разрешенных протоколов для ссылок и новый тип атрибута #domain с возможность перечисления доменов для вставок видеороликов, что должно вообще решатся в калбэке.
Но это только касаемо безопасности.
В чем?
Не утрируйте, я все предельно точно написал выше.
если дифф не умеете делать — разговор ни о чем.
Не усложняя локигу так, что потом было непонятно, что и зачем, у меня в сожалению не вышло.
Я сейчас всего и не вспомню.
Разве топикстартер в своём посте утверждал что-то вроде «Джевикс — фигня, берите мой парсер и будет всё супер»?
За это решение не требуется платить денег, и не утверждается, что обязательно надо его использовать.
Мне кажется, сама суть сообщества (любого) именно в том, чтобы делиться мнениями по улучшению продукта. И дружелюбное отношение к новым решениям будет только способствовать развитию.
Вот Вам пример. Только благодаря этому посту вдруг вспомнилось:
и про cfgSetSpecialCharCallback тоже самое.
Стало быть сообщение уже полезно. Разве нет?
ps. про пустой гитхаб — смешно ;) Вот оказывается в чём заключается уровень. В «под завязку» заполненном гитхабе.
ps.ps. Дабы не нервировать Вас своим пустым профилем, объясню. Давно интересуюсь LS и как правило в основном читаю всевозможные интересные заметки и сообщения. А тут топекстартер посоветовал ознакомится с данной дискуссией.
Это личное мнение. Всем добра! ;)
Не аппроксимируйте все написанное. Если последовательно читать без ангажированности становится ясно почему я акцентировал внимание на том, что нонейм пользователь не вызывает доверия.
И гит на сегодняшний день не обязательно должен быть «забит» своими репами, там ещё активность есть по другим. И вам это должно быть известно.
Автор отрефакторил обычный Жевикс, переименовал методы, переменные, кое-что несомненно улучшил но это все тот же Жевикс, но автор прямо уклоняется от ответа использовал он код Жевикса или нет:
При этом в коде нет никаких комментариев что использован код Жевикса — это тоже нормально?
Qevix github.com/AlexanderGrom/Qevix/blob/master/qevix.php
Jevix github.com/livestreet/livestreet-framework/blob/master/libs/vendor/Jevix/jevix.class.php
т.е. автор:
что написал очень-очень похожий код.
не утверждал, но предлагал:
а раз предлагает, я выразил свою точку зрения по этому поводу, это называется дискуссия или как вы сказали:
поэтому повторю вопрос, с которого начался этот комментарий: так а что, мнения должны быть только хвалебного плана?
Подобный — аналогичный, схожий, совершенно похожий.
Если бы он не был хоть немножко похож, стал ли я это указывать?
Целый день разговор ни о чем. Надо что бы он был написал вверх ногами справа налево и был вообще не похож ни на что другое написанное человечеством? Или что бы он работал и делал то что должен?
Я предполагал, что придут умные ребята, скажут мол «мы тут 6 лет с ним работаем и знаем все его недостатки, а у тебя тут косяк и тут косяк...»
Если вам не дает покоя, что это отрефактореный Jevix, что же никто этого не сделал раньше? Почему у меня 6 лет нет BR'ов в моих CODE? Почему у меня ссылки не правильно подсвечиваются?
Вот снова. Вы долго будете ходить вокруг да около? Вопрос стоял так: вы написали весь код сами, без копипасты или даже не рефакторили код Жевикса для использования в своем Кевиксе?
Повторяю: разговор о том, что вы не признаетесь в использовании кода Жевикса и принимаете форму шланга. Причем если вы признались бы, что да, это был код Жевикса, рассказали почему нет ссылок на пред. авторов и добавили их — вот было бы хорошо.
Код похож на код из Jevixа. Измененный ли это код? да. отрефакторенный? да. улучшенный? да. Но не бывает таких близких совпадений если вы все написали с головы.
какой разговор с человеком:
— который о себе ни слова, но пишет:
на основе чего? статистика? примеры использования? сайты? что это за сайты по доступу к генерированию контента (пользователями/админами)?
— человек не признается в использовании кода другого парсера
— не сохраняет предыдущее авторство в комментариях к проекту
о чем с таким человеком говорить?
вы неправильно причинно-наследственную связь ставите. это вас должно беспокоить что вы выдаете продукт как полностью свой, хотя он по наибольшей вероятности основан на стороннем коде. также вы до сих пор не написали ни "что весь код написан полностью мной" ни "что в Qevixе использован код Jevixа". вместо этого вы уже который раз уходите от ответа.
потому что это никого не интересовало? не было надобности? не было кому? какая разница. вы — сделали и все комментарии сводяться к ожидани вашего ответа на поставленный выше вопрос.
Резюмируя: я сказал что ваш код говно или что-то в этом роде? нет. я сказал что он в лес никому не нужен? нет. я сказал что вы такой неизвестный, а значит вы плохой код априори будете писать? нет.
я написал:
— что код похож на Жевикс и спросил было ли прямое использование его кода? ответа нет, а комментариев ваших много.
— я сказал что ваша анонимность настораживает в ситуации если этот код будут использовать пользователи т.к. они поставят себе его от неизвестно кого.
объясняешь-обьясняешь — все мимо.
И в Read Me на GitHub.
а теперь — обсуждение!
как вы думаете, зачем раньше парсинг литералов делился на латинский алфавит и кириллический? что дало вам от упрощения данного механизма и унификации символов?
В Qevix этого типографирования нет. Два восклицательных знака не заменяется на один, а четыре на три. Может показаться, что это не очень хорошо, но бывают разные обозначения. Например .htaccess, после точки не нужен пробел, есть много обозначений использующих в себе знаки пунктуации.
Кстати, хорошая штука, которая исправляет речь возмущенных пользователей.
Жевикс, кстати, к этому, при всем своем исправлении текста и пунктуации, был приучен.
думаю что автоисправление нужно.
Может на китайцев пока не смотреть?
Отличие производительности в 2 раза.
Среднее время на моей машине:
Qevix: 0.14
Jevix: 0.07
Такая разница в том, что Qevix просматривает и запоминает символы: текущий, до него и после него. Что очень удобно для анализа.
Так вот это он знает только про текущий символ и ничего не знает что было до него и что будет после него.
Но с точки зрения автомата это не состояние.