55 lines
2.2 KiB
PHP
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'
|
|
);
|
|
}
|
|
}
|