Steuerkram/tests/64_AnlageCsvInjectionTest.php

49 lines
1.5 KiB
PHP

<?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');
$felder = explode(';', (string)$zeile);
$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)'
);
}
}