Skip to content

Commit f4ac23d

Browse files
committed
Closes netbox-community#16700: Audit usage of mark_safe() for consistent escaping
1 parent 8b62e40 commit f4ac23d

File tree

8 files changed

+16
-13
lines changed

8 files changed

+16
-13
lines changed

netbox/dcim/tables/cables.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from django.utils.translation import gettext_lazy as _
22
import django_tables2 as tables
33
from django_tables2.utils import Accessor
4+
from django.utils.html import escape
45
from django.utils.safestring import mark_safe
56

67
from dcim.models import Cable
@@ -35,7 +36,7 @@ def _get_terminations(self, manager):
3536

3637
def render(self, value):
3738
links = [
38-
f'<a href="{term.get_absolute_url()}">{term}</a>' for term in self._get_terminations(value)
39+
f'<a href="{term.get_absolute_url()}">{escape(term)}</a>' for term in self._get_terminations(value)
3940
]
4041
return mark_safe('<br />'.join(links) or '&mdash;')
4142

netbox/dcim/views.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3410,8 +3410,9 @@ def post(self, request, pk):
34103410
if membership_form.is_valid():
34113411

34123412
membership_form.save()
3413-
msg = f'Added member <a href="{device.get_absolute_url()}">{escape(device)}</a>'
3414-
messages.success(request, mark_safe(msg))
3413+
messages.success(request, mark_safe(
3414+
f'Added member <a href="{device.get_absolute_url()}">{escape(device)}</a>'
3415+
))
34153416

34163417
if '_addanother' in request.POST:
34173418
return redirect(request.get_full_path())

netbox/extras/models/customfields.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from django.core.validators import RegexValidator, ValidationError
1111
from django.db import models
1212
from django.urls import reverse
13+
from django.utils.html import escape
1314
from django.utils.safestring import mark_safe
1415
from django.utils.translation import gettext_lazy as _
1516

@@ -520,7 +521,7 @@ def to_form_field(self, set_initial=True, enforce_required=True, enforce_visibil
520521
RegexValidator(
521522
regex=self.validation_regex,
522523
message=mark_safe(_("Values must match this regex: <code>{regex}</code>").format(
523-
regex=self.validation_regex
524+
regex=escape(self.validation_regex)
524525
))
525526
)
526527
]

netbox/extras/templatetags/custom_links.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from django import template
2+
from django.utils.html import escape
23
from django.utils.safestring import mark_safe
34

45
from core.models import ObjectType
@@ -59,8 +60,7 @@ def custom_links(context, obj):
5960
# Add non-grouped links
6061
else:
6162
try:
62-
rendered = cl.render(link_context)
63-
if rendered:
63+
if rendered := cl.render(link_context):
6464
template_code += LINK_BUTTON.format(
6565
rendered['link'], rendered['link_target'], cl.button_class, rendered['text']
6666
)
@@ -75,8 +75,7 @@ def custom_links(context, obj):
7575

7676
for cl in links:
7777
try:
78-
rendered = cl.render(link_context)
79-
if rendered:
78+
if rendered := cl.render(link_context):
8079
links_rendered.append(
8180
GROUP_LINK.format(rendered['link'], rendered['link_target'], rendered['text'])
8281
)
@@ -88,7 +87,7 @@ def custom_links(context, obj):
8887

8988
if links_rendered:
9089
template_code += GROUP_BUTTON.format(
91-
links[0].button_class, group, ''.join(links_rendered)
90+
links[0].button_class, escape(group), ''.join(links_rendered)
9291
)
9392

9493
return mark_safe(template_code)

netbox/netbox/tables/columns.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ def render(self, record, value):
433433
f'{k}={getattr(record, v) or settings.FILTERS_NULL_CHOICE_VALUE}'
434434
for k, v in self.url_params.items()
435435
])
436-
return mark_safe(f'<a href="{url}">{value}</a>')
436+
return mark_safe(f'<a href="{url}">{escape(value)}</a>')
437437
return value
438438

439439
def value(self, value):

netbox/utilities/error_handlers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def handle_protectederror(obj_list, request, e):
3939
if hasattr(dependent, 'get_absolute_url'):
4040
dependent_objects.append(f'<a href="{dependent.get_absolute_url()}">{escape(dependent)}</a>')
4141
else:
42-
dependent_objects.append(str(dependent))
42+
dependent_objects.append(escape(str(dependent)))
4343
err_message += ', '.join(dependent_objects)
4444

4545
messages.error(request, mark_safe(err_message))

netbox/utilities/templatetags/builtins/filters.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def linkify(instance, attr=None):
5858
url = instance.get_absolute_url()
5959
return mark_safe(f'<a href="{url}">{escape(text)}</a>')
6060
except (AttributeError, TypeError):
61-
return text
61+
return escape(text)
6262

6363

6464
@register.filter()

netbox/utilities/templatetags/mptt.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from django import template
2+
from django.utils.html import escape
23
from django.utils.safestring import mark_safe
34

45
register = template.Library()
@@ -15,6 +16,6 @@ def nested_tree(obj):
1516
nodes = obj.get_ancestors(include_self=True)
1617
return mark_safe(
1718
' / '.join(
18-
f'<a href="{node.get_absolute_url()}">{node}</a>' for node in nodes
19+
f'<a href="{node.get_absolute_url()}">{escape(node)}</a>' for node in nodes
1920
)
2021
)

0 commit comments

Comments
 (0)