# Import-Sicherheit und Ressourcenlimits ## Geltungsbereich Diese Grenzen gelten für alle von der gemeinsamen Importengine unterstützten Dateien: CSV, JSON, XML, HTML/HTM, XLSX und XLS. Im empfohlenen lokalen Serverbetrieb wird jeder Parserauftrag in einem eigenen Node.js-Worker ausgeführt. Der Browser- und Tauri-Fallback verwendet dieselben Inhaltsgrenzen, besitzt aber keine gleichwertige harte Zeit- und Speicherisolation. Für den späteren Firmenbetrieb ist deshalb ausschließlich der Serverpfad vorgesehen. ## Verarbeitungsreihenfolge 1. Die API begrenzt den JSON-Request und prüft Erweiterung, Base64-Daten linear und stack-sicher sowie deklarierte Größe und tatsächliche Byteanzahl. 2. ZIP-basierte Excel-Dateien werden anhand ihres Zentralverzeichnisses geprüft, bevor SheetJS sie öffnet. 3. Dekodierte Textformate werden vor DOM-, JSON- oder CSV-Parsing auf Größen und gefährliche Konstrukte geprüft. 4. Die formatspezifischen Parser erzeugen das gemeinsame Zwischenmodell. 5. Tabellen-, Zeilen-, Spalten- und Zellgrenzen werden auf diesem Zwischenmodell erneut geprüft. 6. Erst danach folgen Erkennung, Normalisierung, Vorschau und eine ausdrücklich bestätigte, atomare Persistenz. Limitverletzungen erzeugen strukturierte Importdiagnosen. Beim Batchimport bleibt der Fehler auf die betroffene Datei begrenzt. ## Inhaltsgrenzen pro Datei | Ressource | Standardgrenze | |---|---:| | Quelldatei | 100 MiB | | dekodierter Text | 64 Mi Zeichen | | Tabellen | 256 | | Zeilen je Tabelle | 250.000 | | Zeilen insgesamt | 500.000 | | Spalten je Tabelle | 2.000 | | Zeichen je Zelle | 1.000.000 | | Zeichen in allen Zellen | 64 Mi Zeichen | | HTML-/XML-Elemente | 500.000 | | JSON-Verschachtelung | 256 Ebenen | | ZIP-Einträge | 20.000 | | entpackte Größe je ZIP-Eintrag | 128 MiB | | entpackte ZIP-Gesamtgröße | 512 MiB | | ZIP-Kompressionsverhältnis | 200:1 | Zusätzlich gelten maximal 50 Dateien pro Importvorschau und 140 MiB pro API-Request einschließlich Base64-Overhead. ## Parserisolation im Serverbetrieb | Einstellung | Standard | Zulässiger Bereich | |---|---:|---:| | `ASSESSOR_PARSER_TIMEOUT_MS` | 30.000 ms | 1.000–300.000 ms | | `ASSESSOR_PARSER_MAX_CONCURRENT` | 2 Worker | 1–8 | | `ASSESSOR_PARSER_MAX_QUEUE` | 8 Aufträge | 0–100 | | `ASSESSOR_PARSER_MAX_QUEUE_MB` | 256 MiB | 16–2.048 MiB | | `ASSESSOR_PARSER_MEMORY_MB` | 512 MiB Old Generation | 128–2.048 MiB | Jeder Auftrag erhält einen neuen Worker. Nach Ablauf des Zeitlimits wird dieser beendet. Workerfehler und Speicherabbrüche werden als kontrollierte Parserdiagnose zurückgegeben. Ist gleichzeitig die Auftrags- oder Bytekapazität der Warteschlange erreicht, lehnt der Server weitere Parseraufträge kontrolliert ab. Die Young Generation ist zusätzlich auf 64 MiB und der Worker-Stack auf 8 MiB begrenzt. ## Formatspezifische Härtung HTML-Performancefix 2026-09-09: Formatadapter 1.1.1, PingCastle-Extractor 2.2.1 und CIS-CAT-Extractor 1.3.1 verwenden einen gemeinsamen linearen Attributleser. Lange Attribute ohne Wert und lange Leerraeume duerfen keine quadratischen Suchwiederholungen verursachen. Interne PingCastle-IDs und Ankernamen werden fuer das jeweilige Markup einmal indiziert; Duplikate, Reihenfolge und Offsets bleiben erhalten. Profile und fachliche Mappingvertraege bleiben unveraendert. Der rein synthetische 3.159.338-Byte-Regressionstest brach im alten Produktionsworker nach 30.011 ms ab und laeuft nach dem Fix mit allen 40 Regeln und 40 verknuepften Tabellen in beobachteten 1.590 ms. Die Messung ist kein universelles Laufzeitversprechen. Wiederholbar nach dem Build mit `node tests/server/html-parser-stress.mjs`; der Test behaelt das 30-Sekunden-Budget und die 512/64-MiB-Heapgrenzen bei. Die regulaere Suite prueft zusaetzlich begrenzte Zeichenarbeit, Originale und Browser-/Serverparitaet. - HTML: `script`, `style`, eingebettete Frames/Objekte, Formulare, Medien, SVG und weitere aktive Elemente werden entfernt. Ereignisattribute und navigierende oder nachladende Attribute wie `src`, `srcdoc` und `action` werden vor der Tabellenauswertung gelöscht; `href` bleibt nur fuer sichere HTTP(S)-Beleglinks erhalten. Importierter Code wird nicht ausgeführt. Berichte oberhalb von 1 Mi Zeichen sowie DOM-Stacküberläufe wechseln automatisch in eine begrenzte, nicht rekursive Tabellenextraktion. - XML: `DOCTYPE`, `ENTITY`, `SYSTEM` und `PUBLIC` werden vor dem DOM-Parser abgewiesen. Externe Entitäten und lokale Dateireferenzen werden dadurch nicht aufgelöst. - Excel: Verschlüsselte ZIP-Einträge, nicht zugelassene Kompressionsverfahren, ausbrechende Archivpfade, ZIP64 und eingebettete `vbaProject.bin`-Inhalte werden abgewiesen. SheetJS läuft ohne Formel- oder VBA-Auswertung. - CSV-Export: Intern bleiben Originalwerte unverändert. Spreadsheet-orientierte Downloads, Aktionslisten und kopierte Tabellen neutralisieren führende `=`, `+`, `-` oder `@`, damit ein späteres Öffnen keine Formel aktiviert. - ZIP: Eintragsanzahl, Einzel- und Gesamtgröße sowie Kompressionsverhältnis werden ausschließlich aus dem Zentralverzeichnis vor dem Entpacken geprüft. ## PurpleKnight-Vollständigkeit - Native HTML-Zuweisungen werden über den begrenzten statischen Datenleser verarbeitet, nicht evaluiert: maximal 128 Verschachtelungsebenen, 1.000.000 Werte und 16 Mi Zeichen je Datenobjekt, 1.000.000 Zeichen je String sowie 250.000 Indikatoren je Bericht. Globale Datei-/Workergrenzen gelten zusätzlich. - Beschädigte Strukturen und fehlende native IDs scheitern explizit; ein angekündigter Ergebnisbestand darf nicht erfolgreich auf null reduziert werden. Mehrfache Zuweisung derselben Berichtswurzel oder desselben Datenobjekts ist ein Fehler. Wiederholte Regel-IDs erhalten eine Warnung und bleiben als getrennte Vorkommen erhalten. - Deklarierte Summen, Statuszahlen, Kategorieverweise und Detailanzahlen werden gegen die gelesenen Einzeleinträge geprüft. Widersprüche markieren den Import als partiell; Originalzähler und vollständige Einträge bleiben unverändert. - Explizite Null-Details sind bei null Ergebnissen gültig. Zeitstempel werden nicht zur Nachahmung eines Excel-Anzeigeformats auf Minuten gekürzt. - Workbook-Summary, Indikatorentabelle und Ergebnisblätter werden gemeinsam geprüft. CSV-Dateiname allein reicht weiterhin nicht zur Werkzeugfreigabe. ## PingCastle-Strukturtreue Ab Profil 1.5.0 / Extractor 2.2.0 bewahrt der XML-Kontext alle Attribute als dekodierte Originalwerte mit `/@Name`-Quellpfad und ausdrücklich leere Blätter als `empty`. Namespace, Nullwert, `0`, `false` und leere Zeichenkette werden nicht gleichgesetzt. Die vorhandene Attribut-Anzeigezeichenkette bleibt erhalten; ältere Adapter ohne strukturierte Attribute erhalten eine Diagnose statt einer mehrdeutigen Rückkonvertierung. Der originale Dateitext bleibt unverändert. HTML-Formatadapter 1.1.1 und XML-Formatadapter 1.1.0 liefern diese Struktur beziehungsweise eine attributgrenzenbewusste HTML-Extraktion. Spitze Klammern in zitierten Attributen werden nur für die inerte lexikalische Auswertung geschützt. Skripte werden nicht ausgewertet. Attributbereinigung arbeitet auf vollständigen Attributen, nicht auf scheinbaren `src`-/`href`-Angaben innerhalb eines Tooltips. Ein abgeschnittener End-Tag in einem begrenzten Textausschnitt wird nicht als Zellinhalt übernommen; ein nicht abgeschlossenes zitiertes Attribut im vollständigen Dokument führt zu einer Diagnose. Fehlende native Rule IDs werden abgewiesen, doppelte IDs mit einer Warnung gemeldet. Die bestehende erste Darstellung bleibt das Finding. HTML-Trefferzahlen in den Kategorieüberschriften werden gegen eindeutige Regeln abgeglichen; Kataloggrößen sind keine Ergebniszahlen. Abweichungen oder ungültige Zähler markieren die Verarbeitung als `partial`, ohne gültige Regeln zu entfernen. Angekündigte Treffer ohne lesbare Ergebnisse scheitern; ausdrücklich deklarierte Nulltreffer bleiben zulässig. Originalzähler stehen in einem eigenen Berichtsabschnitt, nicht in der Assetzählung. Fehlende Zähler erlauben keinen belegten Vollständigkeitsanspruch. XML-Semantikmapping und Control-Path-JSON bleiben separate Arbeitspakete. Bestehende Importe werden nicht geändert. ## Statische Maester-Berichtsdaten Der Maester-HTML-Extractor 1.1.0 unterstützt JSON und statische Objektliterale in Script-Zuweisungen sowie JSON-Datenblöcken. Der Locator überspringt Zeichenketten, Kommentare und übliche Regex-Literale; er ist kein allgemeiner JavaScript-Parser. Der anschließende Datenparser erlaubt keine Codeausführung und keine dynamischen Ausdrücke. Insbesondere werden Template-Interpolation, Aufrufe, Getter, Spread, berechnete und doppelte Schlüssel abgewiesen. Unbekannte statische Datenfelder bleiben mit ihrem Objektpfad erhalten. Pro Datenobjekt gelten 16 Mi Zeichen, 128 Verschachtelungsebenen, eine Million Werte und eine Million Zeichen pro Zeichenkette. Pro Datei werden höchstens 32 potenzielle Berichtsobjekte geprüft und 250.000 Tests akzeptiert. Eine Grenzverletzung oder ein beschädigter Test führt zum Fehler, nicht zur stillen Kürzung. Mehrere konkurrierende Berichtswurzeln werden abgewiesen; ein expliziter `Tenants`-Container erhält seine getrennten Mandantenpfade. Deklarierte Summen werden gegen Einzeltests geprüft. Abweichungen bleiben Warnungen mit beiden Zählwerten, ohne die Quelle oder die Ergebnismenge zu verändern. ## Vorschau, Persistenz und Protokollierung Nicht bestätigte Vorschauen liegen höchstens 15 Minuten im Arbeitsspeicher. Der Cache ist auf 10 Batches und 256 MiB Quelldaten begrenzt. Abgelaufene oder verdrängte Vorschauen können nicht persistiert werden. Beim Abschluss werden IDs, SHA-256, Dateiname, Größe und Änderungszeit gegen die serverseitige Vorschau geprüft. Die Importpipeline schreibt keine Quelldateien oder Parser-Zwischendateien in temporäre Verzeichnisse. PostgreSQL-Zugriffe verwenden Parameter; ein bestätigter Batch wird in einer Transaktion gespeichert. Das aktuelle Audit-Log enthält nur Zeitpunkt, Request-ID, Methode, Pfad, Status, Dauer und gegebenenfalls einen Fehlercode. Datei- und Requestinhalte werden nicht protokolliert. Das Log liegt derzeit nur im Prozessspeicher; dauerhafte zentrale Protokollierung, Zugriffsschutz und Aufbewahrung gehören zu Phase 14. ## Verifikation Die automatisierten Sicherheits- und Lasttests prüfen unter anderem Größenfehler, ZIP-Bomb-Metadaten, verschlüsselte/VBA-haltige Archive, XML-Entitäten, tiefe JSON-Strukturen, Nullbytes, aktives HTML, Parser-Timeout, Warteschlangenkapazität, Vorschauablauf, Formel-Injection, einen CSV-Import mit 30.000 Datensätzen, ein Zwischenmodell mit 140.000 Zeilen und einen PingCastle-ähnlichen HTML-Bericht mit 5,9 MB. Der PostgreSQL-Integrationstest prüft den tatsächlichen Transaktions- und Persistenzpfad.