- PVSM.RU - https://www.pvsm.ru -
Всем доброго времени суток!
Недавно я задал вопрос на habre, про аналог библиотеки jevix для pyton [1].
Мне подсказали решение, но этих решений мне было недостаточно, да и всем известно что Jevix самая популярная библиотека для работы с html.
Jevix — средство автоматического применения правил набора текстов, наделённое способностью унифицировать разметку HTML/XML документов, контролировать перечень допустимых тегов и аттрибутов, предотвращать возможные XSS-атаки в коде документов.
Автором этой библиотеки для php является, хабра житель ur001 [2], ссылка на проект jevix.ru/project/ [3]
Мне очень нравится эта библиотека, я ее использовал и не раз в своих проектах, но как говорится времена меняются и я начал учить python + django и столкнулся с такой проблемой, взялся я делать проект где нужно жестко контролировать передаваемый html код и не дать врагу никакого шанса на XSS-атаки.
Вот только беда, я не смог найти jevix библиотеки для python или достойного аналога! Вот значит посидев подумав я и решил переписать jevix+php на jevix+python.
Скажу сразу библиотека сырая и находится в beta режиме, всем добровольцам просьба потестить, чтоб в бою не ударить в грязь лицом.
Все банально просто, я старался оставить все как есть и даже название переменных.
Инициализируем
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/ [4]
чтоб потестить в online python+jevix — jevix.vir-mir.ru/ [5]
Скачать — jevix.vir-mir.ru/media/jevix.rar [6]
Автор: lesha_firs
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/26560
Ссылки в тексте:
[1] аналог библиотеки jevix для pyton: http://habrahabr.ru/qa/33927/
[2] ur001: http://habrahabr.ru/users/ur001/
[3] jevix.ru/project/: http://jevix.ru/project/
[4] jevix.ru/: http://jevix.ru/
[5] jevix.vir-mir.ru/: http://jevix.vir-mir.ru/
[6] jevix.vir-mir.ru/media/jevix.rar: http://jevix.vir-mir.ru/media/jevix.rar
[7] Источник: http://habrahabr.ru/post/168439/
Нажмите здесь для печати.