Background Decoration
31.3.2026Dietrich Bojko30 Min. Lesezeit

Mehr Sicherheit im Code: Alte Skripte schrittweise absichern

Zurück zur Übersicht
Mehr Sicherheit im Code: Alte Skripte schrittweise absichern
Photorealistische Darstellung eines alten, rissigen Steinbogens, der von einem modernen, leuchtenden Kohlefaser- und Titan-Exoskelett umschlossen und stabilisiert wird – Symbol für Code-Sicherheit.
5 Views

Häufig gestellte Fragen (FAQ)

Stellen Sie sich vor, Sie finden eine antike, extrem zerbrechliche Vase. Bevor Sie anfangen, Risse zu kleben, fertigen Sie einen 3D-Scan an, um die exakte Originalform zu dokumentieren. Genau das tun Characterization Tests (Charakterisierungstests).

In altem JavaScript-Code existieren oft bizarre Bugs, die über die Jahre versehentlich zu "Features" wurden, auf die sich andere Systemteile verlassen. Anstatt sofort wild zu refactoren, frieren Sie mit einem Test-Framework wie Jest das aktuelle Verhalten ein.

JavaScript
// Beispiel für das Einfrieren eines absurden Ist-Zustands
test('sollte kurioserweise null zurückgeben, wenn der String leer ist', () => {
  // Wir dokumentieren den Bug, anstatt ihn blind zu beheben!
  expect(legacyPriceCalculator("")).toBeNull(); 
});

Diese Tests bilden Ihr erstes, unverzichtbares Sicherheitsnetz. Wenn Sie später den Code aufräumen, warnt Sie dieses Netz sofort lautstark vor unbeabsichtigten Nebenwirkungen.

Auf gar keinen Fall! Ein sofortiger Großputz würde Ihr gesamtes Team wochenlang lahmlegen und ein massives Risiko für neue Fehler bergen. Das wäre wirtschaftlicher Selbstmord.

Die pragmatische Lösung lautet: Frieren Sie auch hier den Status quo ein. Werkzeuge wie suppress-eslint-errors fügen vollautomatisch über jedem einzelnen Regelverstoß einen // eslint-disable-next-line Kommentar ein. Dadurch wird das Bluten gestoppt. Ab diesem Tag schlägt Ihre CI/CD-Pipeline nur noch Alarm, wenn ein Entwickler einen neuen Fehler dieser Art in das Projekt einbaut. Die alten Sünden bauen Sie dann gemütlich und stückweise ab.

Ein kompletter Rewrite eines gewachsenen Systems gleicht dem Versuch, die Reifen eines Autos zu wechseln, während Sie mit Tempo 130 über die Autobahn rasen. Es endet fast immer im Desaster, weil die Weiterentwicklung neuer Features für Monate blockiert wird.

JSDoc bietet eine fantastische, sanfte Brückentechnologie. Sie reichern Ihre reinen JavaScript-Dateien mit Typen-Kommentaren an. Moderne Editoren lesen diese Kommentare und warnen Sie vor Fehlern, ganz ohne aufwendige Kompilierungsschritte.

Wenn Sie TypeScript einführen, tun Sie dies hybrid. Setzen Sie in Ihrer tsconfig.json den Wert "allowJs": true. So können Sie neue Features in sicheren .ts-Dateien schreiben, während der alte Code unangetastet als .js weiterläuft.

Vertrauen ist gut, gnadenlose Automatisierung ist besser. Wenn Abgabetermine drücken, ignorieren wir Menschen gerne blinkende Warnungen im Editor. Um Legacy Code dauerhaft abzusichern, müssen Sie die Sicherheitskontrolle an den "Grenzübergang" Ihres Projekts verlagern.

Nutzen Sie Husky, um sogenannte Pre-Commit-Hooks einzurichten. Sobald ein Kollege versucht, fehlerhaften Code via git commit in das Repository zu schieben, blockiert Husky den Vorgang physisch.

Zusätzlich etablieren Sie eine CI/CD-Pipeline (z.B. mit GitHub Actions). Diese fährt auf dem Server eine neutrale Testumgebung hoch und führt den Linter sowie alle Tests aus. Ein Pull Request darf erst zusammengeführt werden (Merge), wenn die Pipeline grünes Licht gibt.

Diese Analogie stammt aus der Botanik. Eine Würgefeige wächst im Dschungel von oben an einem alten, sterbenden Baumstamm herab. Sie umschlingt ihn, nutzt ihn als Gerüst und ersetzt ihn über die Jahre komplett, bis der alte Baum lautlos verschwindet.

In der Softwarearchitektur bedeutet das: Schreiben Sie gigantische, monolithische Skripte nicht komplett neu. Extrahieren Sie stattdessen winzige, wertvolle Teile (wie eine Steuerberechnung) in kleine, isolierte und perfekt getestete Funktionen (Pure Functions). Klemmen Sie diese frischen "Feigenranken" dann in den alten Code ein. So tauschen Sie das System von innen heraus aus, ohne dass es jemals stehen bleibt.

Das ist einer der gefährlichsten Irrtümer in der Webentwicklung! TypeScript beschützt Sie nur während Sie den Code tippen. Auf dem Live-Server existiert TypeScript nicht mehr. Wenn eine externe Schnittstelle plötzlich ein String-Emoji anstelle einer Zahl sendet, stürzt Ihr ungeschütztes System ab.

Hier benötigen Sie einen unbestechlichen Türsteher für die Laufzeit. Die Bibliothek Zod ist hierfür der absolute Branchenstandard.

JavaScript
1import { z } from 'zod';
2
3// Der Zod-Türsteher definiert das knallharte Gesetz
4const userSchema = z.object({
5  age: z.number().min(18)
6});
7
8// Eingehende Daten werden gnadenlos geprüft, bevor sie die Geschäftslogik berühren
9const safeData = userSchema.parse(incomingApiRequest);

Zod fängt fehlerhafte oder bösartige Payloads ab, lange bevor sie Ihre wertvollen, neugeschriebenen Funktionen erreichen.

Verzichten Sie in Meetings mit Stakeholdern auf technische Fachbegriffe wie "Dependency Injection" oder "Unit Tests". Sprechen Sie stattdessen konsequent die Sprache des Geldes: Zeit, Kosten und Risikominimierung.

Nutzen Sie die Metapher des Motorölwechsels bei einer Spedition. Wer das Öl bei seinen Lkws nie wechselt, spart kurzfristig Geld, riskiert aber einen katastrophalen Motorschaden auf der Autobahn (Systemausfall).

Machen Sie Ihre unsichtbare Arbeit messbar. Schreiben Sie ein kleines Skript, das die verbliebenen // eslint-disable-Kommentare in Ihrem Projekt zählt. Senden Sie jeden Freitag einen automatisierten Bericht: "Wir haben diese Woche 450 potenzielle Fehlerquellen und Sicherheitsrisiken aus dem System entfernt. Die Zeit für das Finden von Bugs hat sich um 20% reduziert." Wenn das Management den sinkenden Graphen der technischen Schulden sieht, wird es den finanziellen Wert Ihrer Arbeit sofort begreifen.

Ausblick: Die Festung steht – jetzt sanieren wir den Keller

Wir haben es gemeinsam geschafft. Unser ehemals verstaubter Legacy Code ist von einem fragilen Kartenhaus zu einer robusten, abwehrbereiten Festung herangewachsen. Die CI/CD-Pipeline wacht mit eiserner Hand, Zod filtert toxische Daten bereits an der Tür heraus, und TypeScript gibt uns beim Schreiben neuer Features die dringend benötigte Orientierung. Sie können abends endlich wieder beruhigt den Laptop zuklappen, ohne die ständige Angst vor nächtlichen Server-Abstürzen im Nacken zu spüren.

Doch halt! Warum ruckelt die frisch modernisierte App bei plötzlichen Spitzenlasten trotzdem noch? Warum dreht sich der Ladekreis unerbittlich weiter? Die Antwort liegt meist tief im Verborgenen. Was nützt uns der schnellste, sauberste API-Endpunkt, wenn er auf ein archaisches Daten-Nadelöhr warten muss?

Erinnern Sie sich an Ihr letztes großes Projekt, bei dem ein einziger fehlender SQL-Index die gesamte Checkout-Seite für quälende fünf Sekunden einfrieren ließ? Der Nutzer springt ab, der Umsatz geht verloren – und das alles nur, weil die Datenbankstruktur nicht mitgewachsen ist. Genau dieses frustrierende Szenario packen wir als Nächstes an.

Im kommenden, sechsten Teil unserer Cluster-Serie verlassen wir die Anwendungsschicht und steigen hinab in den Maschinenraum: unsere Datenbanken. Alte relationale Datenbanken (SQL) gleichen in Legacy-Projekten oft einem vollgestopften, dunklen Dachboden. Über Jahre hinweg wurden Spalten hastig hinzugefügt, obsolete Datensätze aus Angst nie gelöscht und Tabellen bis zur völligen Unkenntlichkeit miteinander verknüpft.

Wir zeigen Ihnen anhand echter, greifbarer Projektbeispiele mit Node.js, Laravel und SQL, wie Sie diesen historischen Datenschrott systematisch ausmisten. Wir schreiben keinen theoretischen Bla-Bla-Code, sondern echte Migrations-Skripte. Sie lernen hautnah, wie Sie extrem langsame Queries entlarven, Datenbank-Migrationen bei laufendem Betrieb (Zero Downtime) durchführen und Ihre Tabellen so strukturieren, dass moderne Anwendungen wieder blitzschnell darauf zugreifen können.

Sind Sie bereit, den ultimativen Flaschenhals in Ihrem System endgültig zu zerschlagen? Dann begleiten Sie uns direkt in den nächsten Artikel:

Teil 6: Datenbanken fit für die Zukunft machen – Wie man alte Datenbestände aufräumt, damit neue Apps schneller darauf zugreifen können (Node.js / Laravel / SQL)

Dietrich Bojko
Über den Autor

Dietrich Bojko

Senior Webentwickler

Webinteger arbeitet seit vielen Jahren produktiv mit Linux-basierten Entwicklungsumgebungen unter Windows.
Der Fokus liegt auf performanten Setups mit WSL 2, Docker, PHP, Node.js und modernen Build-Tools in realen Projekten – nicht auf theoretischen Beispielkonfigurationen.

Die Artikel dieser Serie entstehen direkt aus dem täglichen Einsatz in Kunden- und Eigenprojekten und dokumentieren bewusst auch typische Fehler, Engpässe und bewährte Workarounds.

Webseite besuchen

Schreiben Sie einen Kommentar