Wie diese Prüfung funktioniert
Scanaris extrahiert alle HTML-Kommentare deiner Startseite, also alles zwischen <!-- und -->, und sucht darin nach sechs Geheimnis-Mustern. Vier sind erkennbare Schlüsselformate: geheime Stripe-Schlüssel (sk_live_ gefolgt von 20 oder mehr Zeichen), AWS-Zugangsschlüssel (AKIA und 16 Zeichen), Google-API-Schlüssel (AIza und 35 Zeichen) und Private-Key-Header (-----BEGIN PRIVATE KEY----- sowie die RSA- und EC-Varianten). Die anderen beiden sind explizite Zuweisungen: password, passwd oder pwd gefolgt von einem Wert mit mindestens 6 Zeichen, und api_key, secret, token oder bearer gefolgt von einem Wert mit mindestens 16. Trifft eines zu, öffnet sie einen Befund mit hohem Schweregrad, der den Typ des gefundenen Geheimnisses nennt, nie den Wert. Die Muster sind absichtlich streng: Ein Kommentar wie „hier kommt der Token hin" ohne Wert dahinter wird nicht gemeldet.
Warum das wichtig ist
HTML-Kommentare sind auf der Seite unsichtbar, im Quelltext aber sichtbar, und den Quelltext sieht jeder mit Strg+U oder einem curl. Es gibt keinen praktischen Unterschied zwischen einem Schlüssel im Kommentar und einem Schlüssel in einem Forum. Ein geheimer Stripe-Schlüssel erlaubt Abbuchungen und Erstattungen; ein AWS-Schlüssel, dein Konto und deine Rechnung zu nutzen; ein Datenbankpasswort, alles zu lesen. Und automatisierte Geheimnisjäger durchsuchen das ganze Web nach genau diesen Präfixen, sodass die Zeit zwischen Veröffentlichung und Missbrauch in Minuten gemessen wird.
Warum das passiert
Jemand hinterlässt sich während der Entwicklung eine Notiz („<!-- Nutzer admin / password Vorlaeufig2024 -->"), kommentiert einen Konfigurationsblock „zum Testen" aus, statt ihn zu löschen, oder fügt ein Integrationsbeispiel mit dem echten Schlüssel ein. WordPress-Templates und handgemachte statische Seiten sind am anfälligsten, weil ihre Kommentare unverändert im Browser ankommen. In modernen Frameworks passiert es seltener, aber es passiert: ein Kommentar in einer statischen .html im öffentlichen Ordner oder in einer Komponente, die nicht kompiliert wird.
So behebst du es
- Rotiere zuerst das Geheimnis. Geh davon aus, dass es schon gelesen wurde. Erzeuge beim Anbieter ein neues, trage es auf deinem Server ein und widerrufe das alte. Dann lösch den Kommentar; nicht umgekehrt.
- Durchsuch das Projekt vor dem Deploy, nicht nur die Startseite:
grep -rnE "sk_live_|AKIA[0-9A-Z]{16}|AIza[0-9A-Za-z_-]{35}|BEGIN (RSA |EC )?PRIVATE KEY|(password|api_key|secret|token)\s*[:=]" --include=*.html --include=*.vue --include=*.php --include=*.hbs .
- Entferne Kommentare in Produktion. Vue und Nuxt nehmen sie beim Kompilieren raus; in Next.js erreichen JSX-Kommentare das HTML nie. Für statisches HTML oder WordPress entfernt sie ein Minifier (
html-minifier-tersermitremoveComments) oder dein Optimierungs-Plugin. In PHP nutzt du PHP-Kommentare (<?php // ... ?>), die den Server nie verlassen. - Zugangsdaten gehören in Umgebungsvariablen, nie in ausgelieferte Dateien. Und füge dem Repository einen Geheimnisdetektor hinzu (
gitleaksoder das Secret Scanning von GitHub), damit es nicht wieder reinkommt.
Prüf, ob es behoben ist
curl -s https://deinedomain.de | tr -d '\n' | grep -oE '<!--.{0,200}' | grep -iE "sk_live_|AKIA|AIza|PRIVATE KEY|password|api_key|secret|token|bearer"
Es darf nichts herauskommen. Ideal ist, dass der erste Teil ohne den letzten Filter auch keine Kommentare liefert: In Produktion braucht sie niemand.
Häufige Fragen
Es ist ein Testschlüssel, kein Produktionsschlüssel.
Die Muster unterscheiden das: Stripes sk_test_ wird nicht gemeldet, sk_live_ schon. Ist der Befund erschienen, passt das Format zu einem echten Schlüssel oder zu einer expliziten Passwortzuweisung. Ist es wirklich ein Platzhalter, ersetze ihn durch etwas, das nicht wie ein Zugangsdatum aussieht, etwa ERSETZEN.
Werden JavaScript-Kommentare auch geprüft?
Diese Prüfung schaut nur auf das HTML. Schlüssel in JavaScript-Bundles, kommentiert oder nicht, sucht Geheimnisse im JavaScript, und Verweise auf interne Hosts sucht interne Verweise. Was sonst noch unabsichtlich durchsickert, steht in Geheimnisse, die deine App im Browser preisgibt.
Zählen die bedingten Kommentare des Internet Explorer?
Es sind HTML-Kommentare und sie werden genauso analysiert, enthalten aber keine Geheimnisse und werden nicht gemeldet. Trotzdem sind sie 2026 Ballast: Kein unterstützter Browser interpretiert sie.