Всем доброго времени суток!
Недавно я задал вопрос на habre, про аналог библиотеки jevix для pyton.
Мне подсказали решение, но этих решений мне было недостаточно, да и всем известно что Jevix самая популярная библиотека для работы с html.
Для тех кто впервые слышит по Jevix
Jevix — средство автоматического применения правил набора текстов, наделённое способностью унифицировать разметку HTML/XML документов, контролировать перечень допустимых тегов и аттрибутов, предотвращать возможные XSS-атаки в коде документов.
Автором этой библиотеки для php является, хабра житель ur001, ссылка на проект jevix.ru/project/
Предыстория
Мне очень нравится эта библиотека, я ее использовал и не раз в своих проектах, но как говорится времена меняются и я начал учить python + django и столкнулся с такой проблемой, взялся я делать проект где нужно жестко контролировать передаваемый html код и не дать врагу никакого шанса на XSS-атаки.
Вот только беда, я не смог найти jevix библиотеки для python или достойного аналога! Вот значит поседев подумав я и решил переписать jevix+php на jevix+python.
Поехали
Скажу сразу библиотека сырая и находится в beta режиме, всем добровольцам просьба потестить, чтоб в бою не ударить в грязь лицом.
Что еще не реализовано
- Автор замена, для таких символов как ( r ) на ®
- Добавление отступов от определенных строчек
- нельзя отключить расстановку br в определенных тегах, таких как object… по этому пока что отключил ее полностью
Как пользоваться?
Все банально просто, я старался оставить все как есть и даже название переменных.
Инициализируем
from jevix import Jevix p = Jevix()
p.cfgAllowTags(['ls','ddcut','a', 'img', 'i', 'p', 'b', 'u', 's', 'video', 'em', 'strong', 'nobr', 'li', 'ol', 'ul', 'sup', 'abbr', 'sub', 'acronym', 'h4', 'h5', 'h6', 'br', 'hr', 'pre', 'code', 'object', 'param', 'embed', 'blockquote', 'iframe','table','th','tr','td']) p.cfgSetTagShort(['br','img', 'hr', 'ddcut','ls']); p.cfgSetTagPreformatted(['pre','code','video', 'iframe']) p.cfgAllowTagParams('img', { 0:'src', 'alt' : '#text', 1:'title', 'align': ['right', 'left', 'center', 'middle'], 'width':'#int', 'height':'#int', 'hspace':'#int', 'vspace':'#int', 'class' : ['image-center', 'image-left', 'image-right'] }) p.cfgAllowTagParams('a', { 0:'title', 1:'href', 'rel' : '#text', 'name' : '#text', 'target' : ['_blank'] }) p.cfgAllowTagParams('ddcut', { 0:'name', }) p.cfgAllowTagParams('acronym', { 0:'title', }) p.cfgAllowTagParams('abbr', { 0:'title', }) p.cfgAllowTagParams('param', { 'width' : '#int', 'height' : '#int', 'src' : {'#domain':['youtube.com','rutube.ru','vimeo.com']} }) p.cfgAllowTagParams('iframe', { 'name' : '#text', 'value' : '#text', 'height' : '#int', 'width' : '#int', 'src' : {'#domain':['youtube.com','rutube.ru','vimeo.com','video.yandex.ru']}, }) p.cfgAllowTagParams('ls', { 'user' : '#text' }) p.cfgAllowTagParams('td', { 'colspan':'#int','rowspan':'#int','align':['right', 'left', 'center', 'justify'], 'height':'#int','width':'#int' }) p.cfgAllowTagParams('table', { 'border':'#int', 'cellpadding':'#int','cellspacing':'#int','align':['right', 'left', 'center'], 'height':'#int','width':'#int' }) p.cfgAllowTagParams('embed', { 'src' : {'#domain':['youtube.com','rutube.ru','vimeo.com','video.yandex.ru']}, 'type' : '#text', 'allowscriptaccess' : '#text', 'allowfullscreen' : '#text','width' : '#int', 'height' : '#int', 'flashvars': '#text', 'wmode': '#text' }) p.cfgAllowTagParams('object', { 'width' : '#int', 'height' : '#int', 'data' : {'#domain':['youtube.com','rutube.ru','vimeo.com','video.yandex.ru']}, }) p.cfgSetTagParamsRequired('img', ['src']) p.cfgSetTagParamsRequired('a', ['href']) p.cfgSetTagParamsRequired('iframe', ['src']) p.cfgSetTagCutWithContent(['script', 'style']) p.cfgSetTagChilds('ul', ['li'], False, True) p.cfgSetTagChilds('ol', ['li'], False, True) p.cfgSetTagChilds('object', ['param'], False, True) p.cfgSetTagChilds('object', ['embed'], False, False) p.cfgSetTagChilds('table', ['tr'], False, True) p.cfgSetTagChilds('tr', ['td','th'], False, True) p.cfgSetTagIsEmpty(['param','embed','a','iframe']); p.cfgSetTagNoAutoBr(['ul','ol','object','table','tr']) p.cfgSetTagBlockType(['h4','h5','h6','ol','ul','blockquote','pre','table','iframe', 'object']) p.cfgSetAutoBrMode(True) p.cfgSetTagNoTypography(['code','video','object', 'iframe']) errors = [] text= u"""<iframe width="560" height="315" src="http://youtube.com/embed/lGnGQXUeaVc" frameborder="0" allowfullscreen></iframe>"""
Ну и выполняем
text, errors = p.parse(text) print text, errors
Ссылки:
на официальный проект проект — jevix.ru/
чтоб потестить в online python+jevix — jevix.vir-mir.ru/
Скачать — jevix.vir-mir.ru/media/jevix.rar
ссылка на оригинал статьи http://habrahabr.ru/post/168439/
Добавить комментарий