Skip to content

Commit 1315ae5

Browse files
committed
fix: allow inline scripts in CSP for singlefile build, add input size guard
vite-plugin-singlefile inlines JS into the HTML, so script-src 'self' blocks the app from running. Added 'unsafe-inline' to script-src (acceptable given zero innerHTML usage and no injection vectors). Added 512 KB input size limit to prevent browser freezes from oversized YAML input.
1 parent 7ab8dab commit 1315ae5

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<meta charset="UTF-8">
55
<meta name="viewport" content="width=device-width, initial-scale=1.0">
66
<meta http-equiv="Content-Security-Policy"
7-
content="default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self'; font-src 'self'; base-uri 'none'">
7+
content="default-src 'none'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self'; font-src 'self'; base-uri 'none'">
88
<title>Docker Compose Sanitizer</title>
99
<style>
1010
:root {

src/main.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import { loadConfig, saveConfig, resetConfig, compileConfig, type SanitizerConfi
88
import { copyToClipboard, openPrivateBin, openGist } from './clipboard'
99
import { createShortNotice, createPiiWarning, createFullDisclaimer } from './disclaimer'
1010

11+
const MAX_INPUT_BYTES = 512 * 1024
12+
1113
function el<K extends keyof HTMLElementTagNameMap>(
1214
tag: K,
1315
attrs?: Record<string, string>,
@@ -270,6 +272,17 @@ function init(): void {
270272
return
271273
}
272274

275+
if (new Blob([raw]).size > MAX_INPUT_BYTES) {
276+
errorDiv.textContent = 'Input too large. Maximum 512 KB.'
277+
errorDiv.classList.remove('hidden')
278+
output.classList.add('hidden')
279+
piiWarning.classList.add('hidden')
280+
actions.classList.add('hidden')
281+
statsDiv.classList.add('hidden')
282+
advisoriesDiv.replaceChildren()
283+
return
284+
}
285+
273286
sanitizeBtn.disabled = true
274287
sanitizeBtn.textContent = 'Sanitizing...'
275288

0 commit comments

Comments
 (0)