Вот фрагмент, который удалит все теги, отсутствующие в белом списке, и все атрибуты тегов, отсутствующие в белом списке атрибутов (поэтому вы не можете использовать onclick
).
Это модифицированная версия http://www.djangosnippets.org/snippets/205/, с регулярным выражением для значений атрибутов, чтобы люди не могли использовать href="javascript:..."
, а другие случаи описаны в http://ha.ckers.org/xss.html.
(например, <a href="ja	vascript:alert('hi')">
или <a href="ja vascript:alert('hi')">
и т. д.)
Как видите, в ней используется (удивительная) BeautifulSoup библиотека.
import re
from urlparse import urljoin
from BeautifulSoup import BeautifulSoup, Comment
def sanitizeHtml(value, base_url=None):
rjs = r'[\s]*(&#x.{1,7})?'.join(list('javascript:'))
rvb = r'[\s]*(&#x.{1,7})?'.join(list('vbscript:'))
re_scripts = re.compile('(%s)|(%s)' % (rjs, rvb), re.IGNORECASE)
validTags = 'p i strong b u a h1 h2 h3 pre br img'.split()
validAttrs = 'href src width height'.split()
urlAttrs = 'href src'.split() # Attributes which should have a URL
soup = BeautifulSoup(value)
for comment in soup.findAll(text=lambda text: isinstance(text, Comment)):
# Get rid of comments
comment.extract()
for tag in soup.findAll(True):
if tag.name not in validTags:
tag.hidden = True
attrs = tag.attrs
tag.attrs = []
for attr, val in attrs:
if attr in validAttrs:
val = re_scripts.sub('', val) # Remove scripts (vbs & js)
if attr in urlAttrs:
val = urljoin(base_url, val) # Calculate the absolute url
tag.attrs.append((attr, val))
return soup.renderContents().decode('utf8')
Как говорили другие авторы, почти все библиотеки Python db заботятся о внедрении SQL, так что это должно в значительной степени охватить вас.