From 23ddb6c3c26e3d9f21e88e7ee12f8c4780f8f700 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Thu, 25 Jun 2015 04:19:01 -0500 Subject: [PATCH] fixed issue #999, gluon.sanitiizer.sanitze improvement, thanks macfiron --- gluon/sanitizer.py | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) 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 == '