← Alle Checks
SicherheitTypische Schwere: Mittel

Secrets in HTML-Kommentaren

Sucht in HTML-Kommentaren nach vergessenen Schlüsseln, Passwörtern oder Tokens, die jeder im Quelltext lesen kann.

Was es prüft

Dieser Scanner sucht in HTML-Kommentaren nach Schlüsseln, Passwörtern oder Tokens, die dort vergessen wurden. Er erkennt Geheimnisse, die in Kommentaren stehen und die jeder sehen kann, indem er den Quelltext der Seite anzeigt.

Warum es wichtig ist

HTML-Kommentare sind nicht privat: Sie gelangen unverändert an den Browser und jeder kann sie mit ein paar Klicks lesen. Ein dort vergessenes Geheimnis ist so gut wie veröffentlicht und kann direkten Zugang zu sensiblen Diensten oder Daten gewähren.

Wie man es behebt

Entferne aus dem veröffentlichten Code jeden Kommentar mit Zugangsdaten, und wenn ein Geheimnis jemals offengelegt wurde, widerrufe es und erstelle so schnell wie möglich ein neues. Bewahre Schlüssel immer in serverseitigen Umgebungsvariablen auf, niemals im HTML, das der Browser sieht.

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-terser mit removeComments) 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 (gitleaks oder 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.

Prüf es auf deiner Website

Scanne deine Website kostenlos und sieh, ob dieser und 44 weitere Checks bestehen, mit einem Fix-Prompt für jedes Problem.

Meine Website kostenlos scannen

Aus dem Blog

Verwandte Checks