diff --git a/frontend/src/lib/document/DocumentViewer.svelte b/frontend/src/lib/document/DocumentViewer.svelte index b0ce8af6..aa8a575f 100644 --- a/frontend/src/lib/document/DocumentViewer.svelte +++ b/frontend/src/lib/document/DocumentViewer.svelte @@ -72,6 +72,7 @@ let { {m.doc_download_link()} diff --git a/frontend/src/lib/document/DocumentViewer.svelte.test.ts b/frontend/src/lib/document/DocumentViewer.svelte.test.ts index a3982a0e..f5d70503 100644 --- a/frontend/src/lib/document/DocumentViewer.svelte.test.ts +++ b/frontend/src/lib/document/DocumentViewer.svelte.test.ts @@ -46,6 +46,20 @@ describe('DocumentViewer', () => { .toHaveAttribute('href', '/api/documents/d1/file'); }); + it('hardens the target=_blank download link with rel=noopener noreferrer (CWE-1022)', async () => { + render(DocumentViewer, { + props: { + ...baseProps, + doc: { ...baseProps.doc, filePath: 'docs/scan.pdf' }, + error: 'Render failed' + } + }); + + await expect + .element(page.getByRole('link', { name: /direkter download/i })) + .toHaveAttribute('rel', 'noopener noreferrer'); + }); + it('omits the direct-download link in the error state when filePath is null', async () => { render(DocumentViewer, { props: { ...baseProps, error: 'Render failed' } });