From 5f62d25e23eb1fc53b4a37b8e376e28cfe2aeb22 Mon Sep 17 00:00:00 2001 From: "Jokob @NetAlertX" <96159884+jokob-sk@users.noreply.github.com> Date: Thu, 21 May 2026 00:09:07 +0000 Subject: [PATCH] Implement XSS prevention by encoding special characters in device names across multiple files --- front/deviceDetails.php | 4 +- front/deviceDetailsEdit.php | 6 + front/devices.php | 65 +++---- front/events.php | 8 +- front/js/common.js | 72 ++++++-- front/js/network-api.js | 2 +- front/js/network-tabs.js | 8 +- front/js/network-tree.js | 4 +- front/js/settings_utils.js | 4 +- front/js/ui_components.js | 4 +- front/multiEditCore.php | 2 +- front/presence.php | 2 +- test/ui/test_ui_xss_devname.py | 322 +++++++++++++++++++++++++++++++++ 13 files changed, 439 insertions(+), 64 deletions(-) create mode 100644 test/ui/test_ui_xss_devname.py diff --git a/front/deviceDetails.php b/front/deviceDetails.php index 9d3db549..05067264 100755 --- a/front/deviceDetails.php +++ b/front/deviceDetails.php @@ -517,11 +517,11 @@ function applyDevicePageTitle(mac, name, owner) { ); $('#devicePageInfoPlc').show(); } else if (!owner || (name && name.toString().includes(owner))) { - pageTitleText = name ?? getString("DevDetail_EveandAl_NewDevice"); + pageTitleText = encodeSpecialChars(name ?? getString("DevDetail_EveandAl_NewDevice")); $('#pageTitle').html(pageTitleText); $('#devicePageInfoPlc').hide(); } else { - pageTitleText = `${name ?? getString("DevDetail_EveandAl_NewDevice")} (${owner})`; + pageTitleText = `${encodeSpecialChars(name ?? getString("DevDetail_EveandAl_NewDevice"))} (${encodeSpecialChars(owner)})`; $('#pageTitle').html(pageTitleText); $('#devicePageInfoPlc').hide(); } diff --git a/front/deviceDetailsEdit.php b/front/deviceDetailsEdit.php index 542f2a59..99f22bf6 100755 --- a/front/deviceDetailsEdit.php +++ b/front/deviceDetailsEdit.php @@ -236,6 +236,7 @@ function getDeviceData() { // console.log(setting.setKey); // console.log(fieldData); + // Additional form elements like the random MAC address button for devMac let inlineControl = ""; // handle random mac @@ -329,6 +330,11 @@ function getDeviceData() { fieldOptionsOverride = fieldDataNew; } + // XSS prevention - encode special characters for string fields, but not for arrays (like children dynamic) + // Don't move above the handle devChildrenDynamic block because it relies on the original fieldData to generate options + fieldData = encodeSpecialChars(fieldData); + console.log(fieldData); + // Generate the input field HTML const inputFormHtml = `