@@ -103,10 +103,18 @@ export class DashboardTab {
103103 Object . entries ( features ) . forEach ( ( [ feature , enabled ] ) => {
104104 const featureElement = document . createElement ( 'div' ) ;
105105 featureElement . className = `feature-item ${ enabled ? 'enabled' : 'disabled' } ` ;
106- featureElement . innerHTML = `
107- <span class="feature-name">${ this . formatFeatureName ( feature ) } </span>
108- <span class="feature-status">${ enabled ? '✓' : '✗' } </span>
109- ` ;
106+
107+ // Use textContent instead of innerHTML to prevent XSS
108+ const featureNameSpan = document . createElement ( 'span' ) ;
109+ featureNameSpan . className = 'feature-name' ;
110+ featureNameSpan . textContent = this . formatFeatureName ( feature ) ;
111+
112+ const featureStatusSpan = document . createElement ( 'span' ) ;
113+ featureStatusSpan . className = 'feature-status' ;
114+ featureStatusSpan . textContent = enabled ? '✓' : '✗' ;
115+
116+ featureElement . appendChild ( featureNameSpan ) ;
117+ featureElement . appendChild ( featureStatusSpan ) ;
110118 featuresContainer . appendChild ( featureElement ) ;
111119 } ) ;
112120 }
@@ -296,10 +304,18 @@ export class DashboardTab {
296304 [ 'zone_1' , 'zone_2' , 'zone_3' , 'zone_4' ] . forEach ( zoneId => {
297305 const zoneElement = document . createElement ( 'div' ) ;
298306 zoneElement . className = 'zone-item' ;
299- zoneElement . innerHTML = `
300- <span class="zone-name">${ zoneId } </span>
301- <span class="zone-count">undefined</span>
302- ` ;
307+
308+ // Use textContent instead of innerHTML to prevent XSS
309+ const zoneNameSpan = document . createElement ( 'span' ) ;
310+ zoneNameSpan . className = 'zone-name' ;
311+ zoneNameSpan . textContent = zoneId ;
312+
313+ const zoneCountSpan = document . createElement ( 'span' ) ;
314+ zoneCountSpan . className = 'zone-count' ;
315+ zoneCountSpan . textContent = 'undefined' ;
316+
317+ zoneElement . appendChild ( zoneNameSpan ) ;
318+ zoneElement . appendChild ( zoneCountSpan ) ;
303319 zonesContainer . appendChild ( zoneElement ) ;
304320 } ) ;
305321 return ;
@@ -309,10 +325,18 @@ export class DashboardTab {
309325 const zoneElement = document . createElement ( 'div' ) ;
310326 zoneElement . className = 'zone-item' ;
311327 const count = typeof data === 'object' ? ( data . person_count || data . count || 0 ) : data ;
312- zoneElement . innerHTML = `
313- <span class="zone-name">${ zoneId } </span>
314- <span class="zone-count">${ count } </span>
315- ` ;
328+
329+ // Use textContent instead of innerHTML to prevent XSS
330+ const zoneNameSpan = document . createElement ( 'span' ) ;
331+ zoneNameSpan . className = 'zone-name' ;
332+ zoneNameSpan . textContent = zoneId ;
333+
334+ const zoneCountSpan = document . createElement ( 'span' ) ;
335+ zoneCountSpan . className = 'zone-count' ;
336+ zoneCountSpan . textContent = String ( count ) ;
337+
338+ zoneElement . appendChild ( zoneNameSpan ) ;
339+ zoneElement . appendChild ( zoneCountSpan ) ;
316340 zonesContainer . appendChild ( zoneElement ) ;
317341 } ) ;
318342 }
0 commit comments