Merge pull request #531 from leonelcamara/apostrophe_fpdf

Fix for sanitize(''') returning ''' instead of '''
This commit is contained in:
mdipierro
2014-10-22 21:25:49 -05:00
+5 -14
View File
@@ -10,8 +10,7 @@ Cross-site scripting (XSS) defense
----------------------------------- -----------------------------------
""" """
from HTMLParser import HTMLParser
from htmllib import HTMLParser
from cgi import escape from cgi import escape
from urlparse import urlparse from urlparse import urlparse
from formatter import AbstractFormatter from formatter import AbstractFormatter
@@ -48,11 +47,10 @@ class XssCleaner(HTMLParser):
], ],
allowed_attributes={'a': ['href', 'title'], 'img': ['src', 'alt' allowed_attributes={'a': ['href', 'title'], 'img': ['src', 'alt'
], 'blockquote': ['type']}, ], 'blockquote': ['type']},
fmt=AbstractFormatter,
strip_disallowed=False strip_disallowed=False
): ):
HTMLParser.__init__(self, fmt) HTMLParser.__init__(self)
self.result = '' self.result = ''
self.open_tags = [] self.open_tags = []
self.permitted_tags = [i for i in permitted_tags if i[-1] != '/'] self.permitted_tags = [i for i in permitted_tags if i[-1] != '/']
@@ -77,7 +75,7 @@ class XssCleaner(HTMLParser):
def handle_charref(self, ref): def handle_charref(self, ref):
if self.in_disallowed: if self.in_disallowed:
return return
elif len(ref) < 7 and ref.isdigit(): elif len(ref) < 7 and (ref.isdigit() or ref == 'x27'): # x27 is a special case for apostrophe
self.result += '&#%s;' % ref self.result += '&#%s;' % ref
else: else:
self.result += xssescape('&#%s' % ref) self.result += xssescape('&#%s' % ref)
@@ -99,8 +97,7 @@ class XssCleaner(HTMLParser):
def handle_starttag( def handle_starttag(
self, self,
tag, tag,
method, attrs
attrs,
): ):
if tag not in self.permitted_tags: if tag not in self.permitted_tags:
if self.strip_disallowed: if self.strip_disallowed:
@@ -130,7 +127,7 @@ class XssCleaner(HTMLParser):
self.result += bt self.result += bt
self.open_tags.insert(0, tag) self.open_tags.insert(0, tag)
def handle_endtag(self, tag, attrs): def handle_endtag(self, tag):
bracketed = '</%s>' % tag bracketed = '</%s>' % tag
if tag not in self.permitted_tags: if tag not in self.permitted_tags:
if self.strip_disallowed: if self.strip_disallowed:
@@ -141,12 +138,6 @@ class XssCleaner(HTMLParser):
self.result += bracketed self.result += bracketed
self.open_tags.remove(tag) self.open_tags.remove(tag)
def unknown_starttag(self, tag, attributes):
self.handle_starttag(tag, None, attributes)
def unknown_endtag(self, tag):
self.handle_endtag(tag, None)
def url_is_acceptable(self, url): def url_is_acceptable(self, url):
""" """
Accepts relative, absolute, and mailto urls Accepts relative, absolute, and mailto urls