Как стать автором
Обновить

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

def eror(self, message):

Так торопились, так торопились? :)
нет, именно так и называет функция в php версии, я не знаю какими побуждениями пользовался автор назвав ее так.
Так это еще хуже, вы даже не смотрели что переносили...?
НЛО прилетело и опубликовало эту надпись здесь
извиняюсь опечатка, «Автозамена»
Из коротенького определения так и не понял, что такое Jevix. Можно как-нибудь иначе описать? Скажем, не: «Flask — это питоний фреймворк для веб-приложений», а «Вот предположим, вам нужно сделать крупный тяжёлый сайт без использования CMS, которые генерят глагну за 0.7 секунд и жрут 60 метров памяти. Хорошей идеей в этом случае будет использовать CMF под названием Flask, ибо...». Втыкаете? Не «решение», а «проблема — решение». И… простите, но портировать с одного языка на другой полностью, не используя возможности языка, на который переносите, — как-то не очень хорошо. Может быть, не стоит повторять ошибки и опечатки исходника?..
НЛО прилетело и опубликовало эту надпись здесь
Jevix — это библиотека для обработки html кода вводимого пользователем, Jevix-php используется в сайте habrahabr и играет самую важную роль, с прошью его мы можем писать такие красочно оформленные посты, комментарии и все что тут есть, а НЛО спит спокойно и не боится что кто-то запустит вредоносный js или покорежит страницу, каким нибудь css стилем…

А Вы что-то другое описали.
В Python для такого есть отличная библиотека bleach
Добавлю, что для django поверх этой библиотеки есть приложение django-html_sanitizer
Я правильно понимаю, что можно либо разрешить использование какого-то атрибута у тега, либо не разрешить? Например
<div style="width: 300px;">

Он может разрешить либо любые style, либо никаких, да?

Мы в своё время навелосипедили свой HTML cleaner (подробнее написал комментом ниже) именно из-за того, что нужно было чистить после WYSIWYG и хотелось получить результат как можно ближе к рельности.
я так понимаю вы об этом?
bleach.readthedocs.org/en/latest/clean.html#styles-whitelist

вроде бы все гибко настраивается, если надо — просто кастомный чистильщик можно довесить
Конечно, всё-равно не так гибко, как хотелось бы, но, наверно, если бы нашли эту библиотеку перед написанием велосипеда, то остановились бы на ней. Спасибо.
ну, я думаю эта библиотека покрывает бОльшую часть необходимого. у меня по крайней мере не хватает фантазии, что бы еще я от нее мог желать :)
Пример высосан из пальца, но во всяких object, params есть атрибуты, которых не должно (порой они не мешают, но чем чище — тем лучше) быть у других тегов. То есть нужен не список всех тегов и список всех возможных атрибутов, а по сути иерархический набор правил (ну, по крайней мере, в своём велосипеде мы так и сделали :))

{
     тег, {
         разрешённый атрибут: {
            разрешённый стиль, (разрешённые значения данного стиля),
            ...
        },
        ...
    },
    ...
}
ну у них почти так и сделано на самом деле:

теги задаются списком
атрибуты задаются словарем тег: разрешенные атрибуты (тег может быть *)
стили так же задаются словарем тег: разрешенные стили для этого тега (также разрешается *)

единственное что они не сделали — еще шага вглубь с валидацией значений стиля, я понимаю что это может иногда пригодиться, но думаю не так уж часто.
У меня тоже была необходимость чистить вводимый пользователями html, тогда мы с ilblackdragon написали свой велосипед и по сей день он отлично работает. Одна беда — никак не вынесем велосипед в отдельный проект и живёт он у нас в django-misc вот тут — HTML cleaner.

Логика достаточно простая — есть white-list, описанный в needs.cfg, из которого путём python generator.py создаётся clear.py, в котором мы ходим по DOM и на основе regexp принимаем решение оставить ли тег, если да, то какие свойства у него можно оставить. Потом можно взять clear.py как отдельный файл и вкрутить в нужный проект:

from clear import clear_html_code

clear_html_code("<b>Hello world</b>")


PS Меня пагает ваш Python код… правда страшно… при этом я совершенно не вижу смысла сохранять совместимость в названиях с точностью до буквы — есть очень «хорошие» примеры — Internet Explorer и Windows — они сохраняли обратную совместимость с учётом старых багов с целью того, чтобы не ломать программы, которые эти баги уже эксплуатируют…
Мне подсказали решение, но этих решений мне было недостаточно, да и всем известно что Jevix самая популярная библиотека для работы с html.

Вам советовали решения на основе html5lib, можно узнать что именно было недостаточно? Я глубоко конечно не вдавался, но кажется что Вы хотите делать то же самое, но с более простой настройкой нужных аттрибутов для элементов, а смотря на wiki.whatwg.org/wiki/Sanitization_rules, code.google.com/p/html5lib/source/browse/python/html5lib/sanitizer.py, для этого мне кажется проще в html5lib.sanitizer.HTMLSanitizerMixin.sanitize_token добавить свою проверку зависящую от элемента.
Зачем вы повторили Jevix с его устаревшим самостоятельным разбором HTML?

Вы могли бы уместить библиотеку в пару сотен строк, если бы использовали какую-либо реализацию DOM. В таком случае, можно было бы иметь гораздо более гибкие правила и богатейший набор возможностей.
Главную вещь вы так и не решили, все white list sanitizer'ы которые я видел, достаточно хорошо удаляют не нужные теги и чистят атрибуты, но. Допустим мы хотим как на хабре вставить кусок кода, к примеру такой:

<html>
    <p>
       habrahabr
    </p>
</html>


В вашей нынешней реализации, всё что внутри тега source тоже почистится и выведет только надпись habrahabr
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории