diff --git a/ui/src/pages/alerts.js b/ui/src/pages/alerts.js index e7f7c7926..83dce6e64 100644 --- a/ui/src/pages/alerts.js +++ b/ui/src/pages/alerts.js @@ -1288,11 +1288,13 @@ async function showAlertHistory(alertId) { let alertData = alertDataReq.data; let entryDiv = $('#modal_alert_history_content'); + entryDiv.empty(); + for (let entry in alertData.modification_history) { 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 a9c872ca7..42f983b42 100644 --- a/ui/src/pages/case.asset.js +++ b/ui/src/pages/case.asset.js @@ -446,7 +446,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 4e490fa01..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 data; - } + "render": safeTextRender }, { "data": "user_login", - "render": function(data, type, row) { - return data; - } + "render": safeTextRender }, { "data": "is_service_account", @@ -160,28 +165,24 @@ $(document).ready(function() { "columns": [ { "data": "asset_name", - "render": function(data, type, row) { - return data; - } + "render": safeTextRender }, { "data": "asset_description", - "render": function(data, type, row) { - return data; - } - + "render": safeTextRender }, { "data": "asset_type", "render": function(data, type, row) { - return 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 data; - } + "render": safeTextRender }, { "data": "case_id", @@ -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; } } ],