XML; file_put_contents($absPath, $xmlPayload); $belegId = \Steuerkram\Models\Beleg::create([ 'beleg_nr' => $belegNr, 'filename' => 'rechnung.xml', 'storage_path' => $storagePath, 'mime_type' => 'text/xml', 'file_hash' => hash('sha256', $xmlPayload), 'beleg_datum' => date('Y-m-d'), 'rechnungs_nr' => null, 'betrag_brutto' => 100.00, 'belegtyp' => 'Eingangsrechnung', 'notes' => 'XSLT-XSS-Test', ]); $controller = new \Steuerkram\Controllers\BelegController(); ob_start(); $controller->serveFile(['id' => (string)$belegId]); ob_get_clean(); $headers = headers_list(); $disposition = ''; foreach ($headers as $header) { if (stripos($header, 'Content-Disposition:') === 0) { $disposition = $header; } } $this->assertNotEmpty( $disposition, 'Es wurde ein Content-Disposition-Header gesetzt' ); $this->assert( stripos($disposition, 'attachment') !== false, "XML-Beleg wird als attachment statt inline ausgeliefert (erhalten: {$disposition})" ); @unlink($absPath); } }