diff --git a/ui/src/pages/alerts.js b/ui/src/pages/alerts.js index f5720e2d5..83dce6e64 100644 --- a/ui/src/pages/alerts.js +++ b/ui/src/pages/alerts.js @@ -1294,7 +1294,7 @@ async function showAlertHistory(alertId) { let date = new Date(Math.floor(entry) * 1000); let dateStr = date.toLocaleString(); let entryStr = alertData.modification_history[entry]; - entryDiv.append('
' + dateStr + '
' + entryStr.user + '
'+ entryStr.action +'
'); + entryDiv.append('
' + dateStr + '
' + sanitizeHTML(entryStr.user) + '
'+ sanitizeHTML(entryStr.action) +'
'); } diff --git a/ui/src/pages/case.asset.js b/ui/src/pages/case.asset.js index 4e83fd283..0e3241ff8 100644 --- a/ui/src/pages/case.asset.js +++ b/ui/src/pages/case.asset.js @@ -401,7 +401,7 @@ $(document).ready(function(){ let alerts_content = ""; row.alerts.forEach(alert => { - alerts_content += `#${alert.alert_id} - ${alert.alert_title.replace(/'/g, "'").replace(/"/g, """)}
`; + alerts_content += `#${alert.alert_id} - ${sanitizeHTML(alert.alert_title).replace(/'/g, "'").replace(/"/g, """)}
`; } ); alerts_content += `More..`; diff --git a/ui/src/pages/view.customers.js b/ui/src/pages/view.customers.js index 80833617a..09bd5135a 100644 --- a/ui/src/pages/view.customers.js +++ b/ui/src/pages/view.customers.js @@ -113,6 +113,15 @@ function refresh_client_users(customer_id) { }) } +// Sanitize only for the 'display' render type — DataTables also calls +// render() with 'sort'/'filter'/'type' to build its internal index, and +// those should compare against the raw value rather than the +// HTML-encoded one, or search/sort silently stops matching values that +// contain HTML-significant characters. +function safeTextRender(data, type) { + return type === 'display' ? sanitizeHTML(data) : data; +} + $(document).ready(function() { let customer_id = $('#customer_id').val(); @@ -134,16 +143,12 @@ $(document).ready(function() { }, { "data": "user_name", - "render": function(data, type, row) { - return sanitizeHTML(data); - } + "render": safeTextRender }, { "data": "user_login", - "render": function(data, type, row) { - return sanitizeHTML(data); - } + "render": safeTextRender }, { "data": "is_service_account", @@ -160,28 +165,24 @@ $(document).ready(function() { "columns": [ { "data": "asset_name", - "render": function(data, type, row) { - return sanitizeHTML(data); - } + "render": safeTextRender }, { "data": "asset_description", - "render": function(data, type, row) { - return sanitizeHTML(data); - } - + "render": safeTextRender }, { "data": "asset_type", "render": function(data, type, row) { - return sanitizeHTML(data.asset_name); + if (!data) { + return ''; + } + return type === 'display' ? sanitizeHTML(data.asset_name) : data.asset_name; } }, { "data": "asset_ip", - "render": function(data, type, row) { - return sanitizeHTML(data); - } + "render": safeTextRender }, { "data": "case_id", @@ -241,7 +242,7 @@ $(document).ready(function() { a_anchor.text(data); return a_anchor.prop('outerHTML'); } - return sanitizeHTML(data); + return data; } }, { @@ -253,17 +254,19 @@ $(document).ready(function() { { "data": "state", "render": function(data, type, row) { - if (data !== null) { - return data.state_name; - } else { + if (!data) { return 'Unknown'; } + return type === 'display' ? sanitizeHTML(data.state_name) : data.state_name; } }, { "data": "owner", "render": function(data, type, row) { - return data.user_name; + if (!data) { + return ''; + } + return type === 'display' ? sanitizeHTML(data.user_name) : data.user_name; } } ],