Skip to content

Commit df86344

Browse files
committed
Fix html escaping
Change-Id: I34c188f997cef24497ded6f912b357e9a6eefddc Closes-bug: #1612988
1 parent d4b9916 commit df86344

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

bandit/formatters/html.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@
146146
147147
"""
148148

149+
import cgi
149150
import logging
150151
import sys
151152

@@ -334,14 +335,15 @@ def report(manager, fileobj, sev_level, conf_level, lines=-1):
334335
for index, issue in enumerate(issues):
335336
if not baseline or len(issues[issue]) == 1:
336337
candidates = ''
337-
code = code_block.format(code=issue.get_code(lines, True).
338-
strip('\n').lstrip(' '))
338+
safe_code = cgi.escape(issue.get_code(lines, True).
339+
strip('\n').lstrip(' '))
340+
code = code_block.format(code=safe_code)
339341
else:
340342
candidates_str = ''
341343
code = ''
342344
for candidate in issues[issue]:
343-
candidate_code = (candidate.get_code(lines, True).strip('\n').
344-
lstrip(' '))
345+
candidate_code = cgi.escape(candidate.get_code(lines, True).
346+
strip('\n').lstrip(' '))
345347
candidates_str += candidate_issue.format(code=candidate_code)
346348

347349
candidates = candidate_block.format(candidate_list=candidates_str)

tests/unit/formatters/test_html.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,26 @@ def test_report_contents(self, get_issue_list, get_code):
128128
self.assertIn('CCCCCCC', issue1.text)
129129
self.assertIn('abc.py', issue1.text)
130130

131+
@mock.patch('bandit.core.issue.Issue.get_code')
132+
@mock.patch('bandit.core.manager.BanditManager.get_issue_list')
133+
def test_escaping(self, get_issue_list, get_code):
134+
self.manager.metrics.data['_totals'] = {'loc': 1000, 'nosec': 50}
135+
marker = '<tag in code>'
136+
137+
issue_a = _get_issue_instance()
138+
issue_x = _get_issue_instance()
139+
get_code.return_value = marker
140+
141+
get_issue_list.return_value = {issue_a: [issue_x]}
142+
143+
tmp_file = open(self.tmp_fname, 'w')
144+
b_html.report(
145+
self.manager, tmp_file, bandit.LOW, bandit.LOW)
146+
147+
with open(self.tmp_fname) as f:
148+
contents = f.read()
149+
self.assertNotIn(marker, contents)
150+
131151

132152
def _get_issue_instance(severity=bandit.MEDIUM, confidence=bandit.MEDIUM):
133153
new_issue = issue.Issue(severity, confidence, 'Test issue')

0 commit comments

Comments
 (0)