Steuerkram/tests/64_AnlageCsvInjectionTest.php
2026-07-31 16:52:31 +02:00

52 lines
1.7 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
use Steuerkram\Controllers\EuerController;
class AnlageCsvInjectionTest extends TestCase
{
protected string $testName = 'Test 64: CSV-Formel-Injection im Anlagelisten-Export verhindert';
public function run(): void
{
$year = (int)date('Y');
\Steuerkram\Database::execute(
"INSERT INTO assets (lfd_nr, anlage_nr, bezeichnung, anschaffungsdatum, anschaffungskosten)
VALUES (9998, 'TEST-CSV-INJ', ?, ?, 500.00)",
["=cmd|'/c calc'!A1", $year . '-01-15']
);
ob_start();
$controller = new EuerController();
$controller->anlageCsv(['year' => (string)$year]);
$csv = ob_get_clean();
$lines = explode("\n", $csv);
$zeile = null;
foreach ($lines as $line) {
if (str_contains($line, 'TEST-CSV-INJ')) {
$zeile = $line;
break;
}
}
$this->assertNotEmpty($zeile, 'Zeile mit Test-Anlage in der CSV-Ausgabe gefunden');
// fputcsv() setzt Felder mit Leerzeichen in Anführungszeichen. Die Zeile
// muss daher als CSV geparst werden – ein einfaches explode(';') würde
// die Quotes als Teil des Werts mitliefern.
$felder = str_getcsv(rtrim((string)$zeile, "\r\n"), ';');
$bezeichnung = $felder[1] ?? '';
$this->assertEquals(
"'=cmd|'/c calc'!A1",
$bezeichnung,
'Führendes = in der Bezeichnung wird mit vorangestelltem \' entschärft'
);
$this->assert(
!str_starts_with($bezeichnung, '='),
'Bezeichnungsfeld beginnt nicht mehr mit = (kein von Excel interpretiertes Formelfeld)'
);
}
}