84 lines
3.1 KiB
PHP
84 lines
3.1 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/**
|
|
* Test 65: Reflektiertes XSS über den _error-GET-Parameter bei der
|
|
* Zahlungserfassung (InvoiceController::book()) ist geschlossen.
|
|
*/
|
|
class InvoiceBookReflectedXssTest extends TestCase
|
|
{
|
|
protected string $testName = 'Test 65: Kein reflektiertes XSS über _error-Parameter bei Rechnungs-Zahlungserfassung';
|
|
|
|
public function run(): void
|
|
{
|
|
$datum = date('Y-m-d');
|
|
|
|
$customerId = \Steuerkram\Models\Customer::create([
|
|
'nachname' => 'XssTest',
|
|
'firma' => 'XSS Test GmbH',
|
|
'strasse' => 'Teststraße 1',
|
|
'plz' => '10115',
|
|
'ort' => 'Berlin',
|
|
'payment_days' => 14,
|
|
]);
|
|
|
|
$invoiceId = \Steuerkram\Models\Invoice::create([
|
|
'customer_id' => $customerId,
|
|
'betreff' => 'Testrechnung für XSS-Test',
|
|
'rechnungs_datum' => $datum,
|
|
'leistungszeitraum_von' => date('Y-m-01'),
|
|
'leistungszeitraum_bis' => date('Y-m-t'),
|
|
'lines' => [
|
|
[
|
|
'bezeichnung' => 'Beratungsleistung',
|
|
'menge' => 1,
|
|
'einheit' => 'h',
|
|
'einzelpreis' => 100.00,
|
|
'ust_satz' => 19.0,
|
|
],
|
|
],
|
|
]);
|
|
$rechnungsNr = \Steuerkram\Models\Invoice::finalize($invoiceId);
|
|
$invoice = \Steuerkram\Models\Invoice::find($invoiceId);
|
|
|
|
$belegNr = \Steuerkram\Models\Beleg::generateBelegNr();
|
|
$belegId = \Steuerkram\Models\Beleg::create([
|
|
'beleg_nr' => $belegNr,
|
|
'filename' => $rechnungsNr . '.pdf',
|
|
'storage_path' => '',
|
|
'mime_type' => 'application/pdf',
|
|
'file_hash' => hash('sha256', $rechnungsNr),
|
|
'beleg_datum' => $invoice['rechnungs_datum'],
|
|
'rechnungs_nr' => $rechnungsNr,
|
|
'betrag_brutto' => $invoice['betrag_brutto'],
|
|
'belegtyp' => 'Ausgangsrechnung',
|
|
'notes' => 'Test Ausgangsrechnung',
|
|
]);
|
|
\Steuerkram\Database::execute(
|
|
'UPDATE invoices SET beleg_id=? WHERE id=?', [$belegId, $invoiceId]
|
|
);
|
|
|
|
$payload = '<script>alert(document.cookie)</script>';
|
|
$getBackup = $_GET;
|
|
$_GET['_error'] = ['x' => $payload];
|
|
|
|
try {
|
|
$controller = new \Steuerkram\Controllers\InvoiceController();
|
|
ob_start();
|
|
$controller->book(['id' => (string)$invoiceId]);
|
|
$html = ob_get_clean();
|
|
} finally {
|
|
$_GET = $getBackup;
|
|
}
|
|
|
|
$this->assert(
|
|
!str_contains($html, $payload),
|
|
'Roher <script>-Payload aus $_GET[_error] erscheint nicht unescaped in der Ausgabe'
|
|
);
|
|
$this->assert(
|
|
!str_contains($html, '<script>alert(document.cookie)'),
|
|
'Kein ausführbares <script>-Tag in der Ausgabe (auch nicht durch Groß-/Kleinschreibung o.ä. verschleiert)'
|
|
);
|
|
}
|
|
}
|