diff --git a/gluon/sanitizer.py b/gluon/sanitizer.py
index da71d159..ce23ec3f 100644
--- a/gluon/sanitizer.py
+++ b/gluon/sanitizer.py
@@ -66,14 +66,15 @@ class XssCleaner(HTMLParser):
#to strip or escape disallowed tags?
self.strip_disallowed = strip_disallowed
- self.in_disallowed = False
+ # there might be data after final closing tag, that is to be ignored
+ self.in_disallowed = [True]
def handle_data(self, data):
- if data and not self.in_disallowed:
+ if data and not self.in_disallowed[-1]:
self.result += xssescape(data)
def handle_charref(self, ref):
- if self.in_disallowed:
+ if self.in_disallowed[-1]:
return
elif len(ref) < 7 and (ref.isdigit() or ref == 'x27'): # x27 is a special case for apostrophe
self.result += '%s;' % ref
@@ -81,7 +82,7 @@ class XssCleaner(HTMLParser):
self.result += xssescape('%s' % ref)
def handle_entityref(self, ref):
- if self.in_disallowed:
+ if self.in_disallowed[-1]:
return
elif ref in entitydefs:
self.result += '&%s;' % ref
@@ -89,7 +90,7 @@ class XssCleaner(HTMLParser):
self.result += xssescape('&%s' % ref)
def handle_comment(self, comment):
- if self.in_disallowed:
+ if self.in_disallowed[-1]:
return
elif comment:
self.result += xssescape('' % comment)
@@ -100,11 +101,11 @@ class XssCleaner(HTMLParser):
attrs
):
if tag not in self.permitted_tags:
- if self.strip_disallowed:
- self.in_disallowed = True
- else:
+ self.in_disallowed.append(True)
+ if (not self.strip_disallowed):
self.result += xssescape('<%s>' % tag)
else:
+ self.in_disallowed.append(False)
bt = '<' + tag
if tag in self.allowed_attributes:
attrs = dict(attrs)
@@ -119,6 +120,7 @@ class XssCleaner(HTMLParser):
else:
bt += ' %s=%s' % (xssescape(attribute),
quoteattr(attrs[attribute]))
+ # deal with without href and
without src
if bt == '