Steuerkram/tests/103_ContentDispositionHeaderTest.php
fds2610-bot 3e5810990c Fix #217: Content-Disposition-Header gegen Parameter-Injection maskieren
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-06 15:20:21 +02:00

55 lines
2.2 KiB
PHP

<?php
declare(strict_types=1);
use Steuerkram\View;
/**
* Test 103: Content-Disposition-Header ohne Parameter-Injection über den
* Dateinamen (Issue #217)
*
* Beim Beleg-Upload übernimmt die Anwendung den vom Client gesendeten
* Dateinamen unverändert. View::contentDispositionHeader() muss verhindern,
* dass ein präparierter Dateiname aus dem filename="..."-Parameter ausbricht
* und einen zusätzlichen filename*=-Parameter einschleust.
*/
class ContentDispositionHeaderTest extends TestCase
{
protected string $testName = 'Test 103: Content-Disposition ohne Header-Injection';
public function run(): void
{
$bösartig = 'legit"; filename*=UTF-8\'\'%2e%2e%2fevil.exe';
$header = View::contentDispositionHeader('inline', $bösartig);
$this->assert(
!str_contains($header, 'legit"; filename*='),
'Eingeschleustes filename*= bricht nicht aus dem ersten Parameter aus'
);
$this->assertEquals(
1,
substr_count($header, '"; filename*='),
'Es gibt nur ein echtes filename*=-Parameter (direkt nach dem schließenden Anführungszeichen)'
);
$this->assert(!str_contains($header, "\r") && !str_contains($header, "\n"), 'Header enthält kein CR/LF');
$mitAnführungszeichen = View::contentDispositionHeader('attachment', 'a"b\\c.pdf');
$this->assert(
!preg_match('/filename="[^"]*"[^"]*"/', $mitAnführungszeichen),
'Anführungszeichen im Dateinamen schließen den filename-Parameter nicht vorzeitig'
);
$umlaut = View::contentDispositionHeader('inline', 'Rechnung Übersicht äöü.pdf');
$this->assert(
str_contains($umlaut, "filename*=UTF-8''" . rawurlencode('Rechnung Übersicht äöü.pdf')),
'filename* transportiert den unveränderten UTF-8-Namen RFC-6266-konform'
);
$normal = View::contentDispositionHeader('attachment', 'Rechnung-2026-001.pdf');
$this->assertEquals(
'attachment; filename="Rechnung-2026-001.pdf"; filename*=UTF-8\'\'Rechnung-2026-001.pdf',
$normal,
'Unauffällige Dateinamen bleiben unverändert'
);
}
}