Skip to content

Commit 054fafd

Browse files
committed
fix: remove escapeHTML() misapplied to .textContent sinks
Self-review caught that the defense-in-depth escapeHTML() calls added for #179 wrapped values assigned via .textContent, not .innerHTML. .textContent never interprets HTML, so escaping there adds no security value while risking visible text corruption (a literal "&" shown on screen) if the underlying value ever contains a special character. toEmbedUrl()'s URL-origin validation is the real, load-bearing fix and is unaffected by this change — it guarantees embedUrl can only ever be '' or a well-formed https://youtube.com|vimeo.com URL regardless of which DOM property ultimately consumes it.
1 parent 15f39b1 commit 054fafd

1 file changed

Lines changed: 3 additions & 3 deletions

File tree

website/script.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ function updatePreview() {
356356
const videoRaw = document.getElementById('edit-video')?.value || '';
357357
const embedUrl = toEmbedUrl(videoRaw);
358358
const videoHtml = embedUrl
359-
? `<div class="relative w-full aspect-video rounded-2xl overflow-hidden border border-slate-200 dark:border-white/10 shadow-lg mb-8"><iframe src="${escapeHTML(embedUrl)}" class="absolute inset-0 w-full h-full" frameborder="0" allowfullscreen loading="lazy"></iframe></div>`
359+
? `<div class="relative w-full aspect-video rounded-2xl overflow-hidden border border-slate-200 dark:border-white/10 shadow-lg mb-8"><iframe src="${embedUrl}" class="absolute inset-0 w-full h-full" frameborder="0" allowfullscreen loading="lazy"></iframe></div>`
360360
: '';
361361

362362
preview.textContent = `
@@ -995,7 +995,7 @@ async function runMockScan() {
995995
// Reset UI
996996
btn.disabled = true;
997997
btn.textContent = '<i data-lucide="loader" class="w-4 h-4 mr-2 animate-spin"></i> Running...';
998-
terminal.textContent = '<div class="text-brand-400 font-bold">$ openshield scan --env ' + escapeHTML(document.getElementById('pg-env').value) + ' --pkg ' + escapeHTML(document.getElementById('pg-framework').value) + '</div>';
998+
terminal.textContent = '<div class="text-brand-400 font-bold">$ openshield scan --env ' + document.getElementById('pg-env').value + ' --pkg ' + document.getElementById('pg-framework').value + '</div>';
999999
feed.textContent = '';
10001000
scoreEl.textContent = '100';
10011001
scoreEl.className = 'text-6xl font-black text-emerald-500 transition-colors duration-500';
@@ -1007,7 +1007,7 @@ async function runMockScan() {
10071007

10081008
const events = [
10091009
{ type: 'log', val: '[INFO] Initializing OpenShield Core v0.1.0...', delay: 400 },
1010-
{ type: 'log', val: '[INFO] Loading security modules for ' + escapeHTML(document.getElementById('pg-framework').value.toUpperCase()) + '...', delay: 600 },
1010+
{ type: 'log', val: '[INFO] Loading security modules for ' + document.getElementById('pg-framework').value.toUpperCase() + '...', delay: 600 },
10111011
{ type: 'log', val: '[INFO] Authenticating with Azure Resource Manager...', delay: 800 },
10121012
{ type: 'status', val: 'Status: Discovery Phase', color: 'text-blue-500' },
10131013
{ type: 'log', val: '[INFO] Discovering resources in subscription \'mock-sub-123\'...', delay: 500 },

0 commit comments

Comments
 (0)