# Hullwise > Hullwise prüft Websites und vibe-gecodete Apps (Lovable, Bolt, Cursor, Claude Code, Codex, v0, Replit) von außen auf offen liegende Schlüssel, Datenlecks und Sicherheitslücken. Ein Check ruft die Seite einmal ab und lädt die JavaScript-Dateien, die die Seite selbst einbindet (nur dieselbe Domain, höchstens 10 Dateien und 6 MB). Dazu kommen ein TLS-Handschlag und SPF und DMARC aus dem öffentlichen DNS. Bewertet werden geheime Schlüssel in HTML und JavaScript, Schutz-Header, Zertifikat, E-Mail-Schutz, Software-Versionen mit bekannten Lücken (OSV.dev) und Cookies. Das Ergebnis ist eine Note von A bis F mit Punkten von 0 bis 100, erkannten Plattformen und Befunden mit fester ID. Den Check gibt es auch per REST-API und MCP-Server. REST-API: https://hullwise.co/api/v1, braucht immer einen Schlüssel im Header `Authorization: Bearer sc_live_…` (Test-Schlüssel `sc_test_demo`). MCP-Server: https://hullwise.co/mcp (Streamable HTTP, zustandslos, kein OAuth, Schlüssel optional, ohne Schlüssel 20 Checks pro Stunde je IP). MCP-Tools: scan_website, list_checks. Prüfen Sie nur Seiten, die der Person gehören oder die sie prüfen darf (https://hullwise.co/acceptable-use). Bericht: Ohne bezahlten Plan (kostenloser Schlüssel, Test-Schlüssel, MCP ohne Schlüssel) sind nur 2 Befunde vollständig. Gesperrte Befunde haben `locked: true`, ein leeres `label` und keine `id`. Das Feld `locked: { hidden, total }` nennt die Zahlen. Vollständige Berichte über API und MCP ab Business (https://hullwise.co/pricing). ## API und MCP - [Erste Schritte](https://hullwise.co/docs): In drei Schritten zum ersten Check per REST-API oder MCP. - [Authentifizierung](https://hullwise.co/docs/authentication): Bearer-Schlüssel, was ohne Schlüssel geht, Limits und Rate-Limit-Header. - [Prüfpunkte](https://hullwise.co/docs/checks): Alle Prüfungen mit fester ID, Stufe und Erklärung. - [Methode](https://hullwise.co/docs/method): Was ein Check lädt, Grenzen, Punkte je Header, Abzüge, Notengrenzen und Datenquellen. - [Fehler](https://hullwise.co/docs/errors): Fehlerform { error: { code, message } } und alle Codes mit HTTP-Status. - [MCP](https://hullwise.co/docs/mcp): MCP-Server in Claude, ChatGPT, Claude Code, Codex, Cursor und VS Code einbinden. - [API-Referenz](https://hullwise.co/docs/api): Endpunkte mit Parametern, Beispiel-Antwort, Feldern und gekürzten Berichten ohne bezahlten Plan. - [OpenAPI](https://hullwise.co/api/v1/openapi.json): OpenAPI 3.1 mit MCP-Tool und Annotationen je Operation. - [Volle Entwickler-Doku](https://hullwise.co/llms-full.txt): alle Doku-Seiten als eine Markdown-Datei. ## Hilfe Artikel für Betreiber von Websites und Apps, in Alltagssprache. - [Der erste Check](https://hullwise.co/help/getting-started): Adresse eingeben, Ergebnis lesen und sehen, womit Sie anfangen. - [Vibe-Coding-Apps absichern](https://hullwise.co/help/vibe-coding): Welche Lücken Apps aus Lovable, Bolt, Cursor, Claude Code, Codex, v0 oder Replit oft haben, was Hullwise davon findet und was Sie bei einem offenen Schlüssel sofort tun. - [Wie die Note entsteht](https://hullwise.co/help/note): Wofür es Punkte gibt, was abgezogen wird und ab wann es ein A ist. - [Was wir nicht prüfen](https://hullwise.co/help/was-wir-nicht-pruefen): Was ein Check von außen liest, was er nie tut, was er deshalb nicht sieht und wann sich ein Audit lohnt. - [Schutz-Einstellungen für den Browser](https://hullwise.co/help/security-headers): Sechs Zeilen, die Ihr Server bei jedem Aufruf mitschickt. Wogegen jede hilft und mit welchem Wert Sie anfangen. - [HTTPS und Zertifikat](https://hullwise.co/help/https): Ob Ihre Seite verschlüsselt erreichbar ist, wann Ihr Zertifikat abläuft und was bei einer Warnseite hilft. - [Schutz gegen gefälschte Mails](https://hullwise.co/help/e-mail-schutz): Zwei Einträge bei Ihrem Domain-Anbieter legen fest, wer Mails in Ihrem Namen senden darf (SPF und DMARC). - [Veraltete Software mit bekannten Lücken](https://hullwise.co/help/versionen): Woran wir Versionen erkennen, woher wir die Lücken kennen und warum der Befund „möglicherweise betroffen“ heißt. - [Was jeder in Ihrem Code lesen kann](https://hullwise.co/help/code-pruefung): Zugangsschlüssel für Datenbank, KI-Dienste und Zahlungen, Fehlermeldungen und andere Spuren im HTML und in den JavaScript-Dateien Ihrer App. - [Cookies absichern](https://hullwise.co/help/cookies): Was die Merkmale Secure und HttpOnly bewirken und wie Sie sie setzen. - [Datenschutz-Check (DSGVO)](https://hullwise.co/help/datenschutz): Google Fonts, Tracking vor der Einwilligung, eingebettete Inhalte und Impressum: was wir erkennen und wie Sie es beheben. - [Domain und DNS](https://hullwise.co/help/domain-dns): Übernahme verwaister Adressen, CAA, DNSSEC, security.txt, SPF-Abfragen und MTA-STS. - [Technik-Erkennung](https://hullwise.co/help/technik-erkennung): Woran wir sehen, womit und wo Ihre Seite gebaut ist, und wie Sie weniger davon preisgeben. - [Header setzen nach Plattform](https://hullwise.co/help/header-setzen): Vorlagen für Vercel, Netlify, Next.js, Cloudflare, nginx und Apache. Dazu, was bei WordPress, Shopify, Lovable und Bolt geht. - [Wenn ein Befund nicht stimmt](https://hullwise.co/help/fehlalarme): Warum ein Befund manchmal danebenliegt und wie Sie uns das melden. - [API und KI-Assistenten](https://hullwise.co/help/api-und-ai): Den Check aus eigenem Code, einer Pipeline oder einem KI-Assistenten wie Claude oder Cursor starten. - [Ihre Daten](https://hullwise.co/help/daten): Was wir speichern, was nie und warum es keine öffentlichen Ergebnisseiten gibt. ## Prüfpunkte ### Verschlüsselung und Zertifikat - `https.missing` (warn): Kein HTTPS. Die Seite landet am Ende unverschlüsselt auf http. Eingaben wie Passwörter gehen lesbar durchs Netz, die Note ist immer F. - `https.no_redirect` (warn): Keine Weiterleitung von http auf https. Die Startseite antwortet über http:// mit Inhalt statt auf https:// umzuleiten. Wer die Adresse so aufruft, surft unverschlüsselt. Mit HSTS nur ein Hinweis, weil wiederkehrende Besucher geschützt sind. - `tls.invalid` (warn): Zertifikat ungültig. Browser zeigen eine Warnseite statt Ihrer Seite, etwa weil das Zertifikat nicht zur Adresse passt. - `tls.expired` (warn): Zertifikat abgelaufen. Das Ablaufdatum ist vorbei. Browser zeigen eine Warnseite statt Ihrer Seite. - `tls.expiring` (warn): Zertifikat läuft bald ab. Unter 14 Tagen eine Warnung, unter 30 Tagen ein Hinweis. Danach sehen Besucher eine Warnseite. - `tls.old_protocol` (warn): Veraltete Verschlüsselung. Unsere Verbindung lief über TLS 1.0 oder 1.1. Beide gelten als unsicher, das BSI setzt mindestens TLS 1.2 voraus. ### Schutz-Einstellungen für den Browser - `header.csp.missing` (warn): Kein Schutz gegen eingeschleuste Skripte. Weder der Header Content-Security-Policy noch ein gleichwertiges meta-Tag mit script-src oder default-src ist gesetzt. Gelangt fremder Code in die Seite, führt der Browser ihn aus. - `header.csp.weak` (info): CSP hält eingeschleuste Skripte kaum auf. Die Content-Security-Policy ist gesetzt, regelt aber keine Skripte, erlaubt 'unsafe-inline' ohne Nonce oder Hash oder lässt Skripte von beliebigen Adressen zu. Bewertet wie beim CSP Evaluator von Google. Statt 25 gibt es dann 10 Punkte. - `header.hsts.missing` (warn): Verschlüsselung nicht dauerhaft festgelegt. Der Header Strict-Transport-Security (HSTS) fehlt oder steht auf max-age=0. In offenen Netzen lassen sich Besucher dann auf eine unverschlüsselte Fassung umlenken. - `header.frame.missing` (info): Fremde Seiten dürfen Ihre Seite einbetten. Weder X-Frame-Options noch frame-ancestors in der CSP ist gesetzt. Nutzer können so zu unsichtbaren Klicks verleitet werden. - `header.xcto.missing` (info): Browser dürfen Dateitypen raten. Der Header X-Content-Type-Options fehlt. Eine hochgeladene Datei kann dann als Skript laufen. - `header.referrer.missing` (info): Volle Adressen gehen an fremde Seiten. Der Header Referrer-Policy fehlt. Beim Klick auf einen Link kann die ganze Adresse mitgehen, samt Kennungen darin. - `header.permissions.missing` (info): Kamera, Mikrofon und Standort nicht gesperrt. Der Header Permissions-Policy fehlt. Eingebettete fremde Inhalte dürfen nach diesen Funktionen fragen. - `header.server.version` (info): Server nennt seine Version. Der Server-Header enthält eine Versionsnummer. Wer eine Lücke darin kennt, findet die Seite schneller. - `header.poweredby` (info): Seite nennt ihre Technik. Der Header X-Powered-By ist gesetzt. Gebraucht wird er nicht. ### Schutz gegen gefälschte Mails - `email.spf.missing` (warn): Absender nicht festgelegt (SPF). Auf der Domain steht kein TXT-Eintrag mit v=spf1. Fälschungen mit Ihrer Absenderadresse fallen Postfächern schwerer auf. - `email.spf.allow_all` (warn): SPF erlaubt jeden Absender. Der SPF-Eintrag endet auf +all. Jeder Server darf damit in Ihrem Namen senden. - `email.dmarc.missing` (warn): Keine Regel für gefälschte Mails (DMARC). Unter _dmarc steht kein TXT-Eintrag mit v=DMARC1. Gefälschte Mails in Ihrem Namen werden zugestellt. - `email.dmarc.none` (info): DMARC meldet nur. Die Regel p=none meldet Fälschungen, weist aber keine ab. - `email.spf.too_many_lookups` (warn): SPF mit zu vielen DNS-Abfragen. Der SPF-Eintrag löst samt eingebundener Einträge mehr als 10 DNS-Abfragen aus (RFC 7208). Viele Postfächer werten ihn dann als Fehler. - `email.transport.unprotected` (info): Kein MTA-STS und kein DANE. Die Domain empfängt Mails, legt aber nicht fest, dass sie nur verschlüsselt zugestellt werden. Ein Angreifer im Netz kann die Verschlüsselung zwischen Mailservern unterdrücken. ### Domain und DNS - `dns.takeover` (warn): Adresse kann übernommen werden. Die Adresse zeigt per CNAME auf einen Dienst wie GitHub Pages, Heroku, Amazon S3 oder Shopify, dessen Ziel nicht mehr existiert (erkannt an der Fehlerseite des Dienstes). Wer es dort anlegt, liefert unter Ihrer Adresse eigene Inhalte aus. - `dns.caa.missing` (info): Kein CAA-Eintrag. Jede Zertifizierungsstelle darf ein Zertifikat für die Domain ausstellen. - `dns.dnssec.missing` (info): Kein DNSSEC. Die Domain ist nicht signiert, DNS-Antworten lassen sich unterwegs fälschen. Abgefragt über DNS-over-HTTPS bei Cloudflare. - `dns.securitytxt.missing` (info): Keine security.txt. Unter /.well-known/security.txt steht keine Kontaktadresse für Sicherheitsmeldungen (RFC 9116). - `dns.securitytxt.expired` (info): security.txt abgelaufen. Das Datum unter Expires liegt in der Vergangenheit. ### Veraltete Software - `version.eol` (warn): Software ohne Sicherheits-Updates. Für diese Version liefert der Hersteller keine Updates mehr (Quelle: endoflife.date). Neue Lücken bleiben offen. - `version.vulnerable` (warn): Software mit bekannten Lücken. Für die erkannte Version gibt es Einträge bei OSV.dev oder in unserer eigenen Liste. Wir melden sie als „möglicherweise betroffen“. ### Quelltext und JavaScript-Dateien - `code.secret_pattern` (warn): Möglicher Schlüssel unter verräterischem Namen. Im HTML steht ein Wert unter einem Namen wie client_secret, api_secret oder access_token. Jeder Besucher kann ihn kopieren. Wir nennen den Namen und zeigen den Wert nur gekürzt, nie vollständig. Schlüssel mit bekanntem Präfix (Stripe, AWS, OpenAI …) melden wir unter ihrer eigenen ID. - `code.secret.supabase_service_role` (warn): Supabase-Generalschlüssel öffentlich. service_role-Schlüssel im Quelltext oder in den JavaScript-Dateien. Damit kann jeder die ganze Datenbank lesen, ändern und löschen, an allen Zugriffsregeln vorbei. - `code.secret.supabase_secret_key` (warn): Geheimer Supabase-Schlüssel öffentlich. sb_secret-Schlüssel im Quelltext oder in den JavaScript-Dateien. Damit kann jeder auf die ganze Datenbank zugreifen. - `code.secret.llm_key` (warn): KI-Schlüssel öffentlich. Schlüssel für OpenRouter, Groq, xAI, Hugging Face, Replicate, Perplexity oder ElevenLabs im Quelltext oder in den JavaScript-Dateien. Jeder kann damit auf Ihre Rechnung Anfragen stellen. - `code.secret.webhook_url` (warn): Webhook-Adresse öffentlich. Slack-, Discord-, Teams- oder Zapier-Webhook im Quelltext oder in den JavaScript-Dateien. Jeder kann darüber Nachrichten in Ihre Kanäle schicken, auch gefälschte Anweisungen. - `code.llm.browser_direct` (warn): KI-Aufruf direkt aus dem Browser. Die App spricht OpenAI oder Anthropic ohne eigenen Server an. Der Schlüssel liegt dafür im Browser und lässt sich auslesen. - `code.env.public_secret_name` (warn): Geheime Variable im öffentlichen Code. VITE_-, NEXT_PUBLIC_- oder REACT_APP_-Variable mit SECRET, PRIVATE oder PASSWORD im Namen. Ihr Wert landet in jedem Browser. - `code.secret.openai` (warn): OpenAI-Schlüssel öffentlich. API-Schlüssel für OpenAI im Quelltext oder in den JavaScript-Dateien. Jeder kann damit auf Ihre Rechnung Anfragen stellen. - `code.secret.anthropic` (warn): Anthropic-Schlüssel öffentlich. API-Schlüssel für Claude im Quelltext oder in den JavaScript-Dateien. Jeder kann damit auf Ihre Rechnung Anfragen stellen. - `code.secret.stripe` (warn): Geheimer Stripe-Schlüssel öffentlich. sk_live- oder rk_live-Schlüssel im Quelltext oder in den JavaScript-Dateien. Je nach Rechten lassen sich damit Zahlungen erstatten und Kundendaten abrufen. - `code.secret.aws` (warn): AWS-Zugangsschlüssel öffentlich. AKIA- oder ASIA-Schlüssel im Quelltext oder in den JavaScript-Dateien. Je nach Rechten erreicht man damit Speicher, Server und Rechnung Ihres AWS-Kontos. - `code.secret.github` (warn): GitHub-Token öffentlich. Zugangstoken für GitHub im Quelltext oder in den JavaScript-Dateien. Je nach Rechten lässt sich damit Ihr Quellcode lesen oder ändern. - `code.secret.slack` (warn): Slack-Token öffentlich. Slack-Token im Quelltext oder in den JavaScript-Dateien. Je nach Rechten lassen sich damit Nachrichten lesen oder senden. - `code.secret.sendgrid` (warn): SendGrid-Schlüssel öffentlich. Schlüssel für den Mailversand im Quelltext oder in den JavaScript-Dateien. Jeder kann damit Mails über Ihr Konto verschicken. - `code.secret.mail_api` (warn): Schlüssel für den Mailversand öffentlich. Schlüssel für Resend, Brevo oder Mailchimp im Quelltext oder in den JavaScript-Dateien. Jeder kann damit Mails über Ihr Konto verschicken, etwa Phishing mit Ihrer Absenderadresse, oder Ihre Kontaktlisten abrufen. - `code.secret.service_token` (warn): Zugangstoken für einen Online-Dienst öffentlich. Token mit eindeutigem Präfix oder unter eindeutigem Namen, etwa für das Supabase-Konto, Shopify-Admin, Google OAuth, Notion, Airtable, Telegram, GitLab, npm, Webhook-Signaturen (whsec_) und über 100 weitere Dienste aus dem Regelwerk von gitleaks, darunter Atlassian, Cloudflare, Datadog, Doppler, Heroku, Mailgun, Pulumi und Square. Je nach Dienst lassen sich damit Daten lesen, ändern oder Aktionen in Ihrem Namen auslösen. - `code.secret.twilio` (warn): Twilio-Schlüssel öffentlich. Schlüssel für SMS und Telefonie im Quelltext oder in den JavaScript-Dateien. Jeder kann damit auf Ihre Kosten SMS senden. - `code.secret.database_url` (warn): Datenbank-Zugang mit Passwort öffentlich. Verbindungsadresse mit Benutzer und Passwort im Quelltext oder in den JavaScript-Dateien. Wer sie hat, kann sich direkt an der Datenbank anmelden. - `code.secret.private_key` (warn): Privater Schlüssel öffentlich. Privater Schlüssel (PEM) im Quelltext oder in den JavaScript-Dateien. Wer ihn hat, kann sich als Ihr Dienst ausgeben. - `code.supabase.rls_check` (info): Datenbank direkt aus dem Browser erreichbar. Supabase mit öffentlichem Schlüssel (anon oder sb_publishable). Geschützt sind die Daten nur mit Zugriffsregeln (RLS) auf jeder Tabelle. Ob sie aktiv sind, sehen wir von außen nicht. - `code.firebase.rules_check` (info): Firebase direkt aus dem Browser erreichbar. Die Firebase-Konfiguration steht im Quelltext. Das ist so vorgesehen, geschützt sind die Daten aber nur durch Security Rules in Firestore, Realtime Database und Storage. Ob sie greifen, sehen wir von außen nicht. - `code.sourcemap_bundle` (info): Quellcode-Karten in den JavaScript-Dateien. Öffentlich abrufbare .map-Dateien, über die sich der Original-Quellcode samt Kommentaren wiederherstellen lässt. Wir melden sie nur, wenn die Datei wirklich ausgeliefert wird. - `code.public_key` (info): Google-Schlüssel im Quelltext. Im HTML oder in den JavaScript-Dateien, oft gewollt, etwa für Maps. Firebase-Konfigurationen melden wir gesondert. Ohne Beschränkung auf Ihre Domain kann ihn jeder auf Ihre Kosten nutzen. - `code.mixed_content` (warn): Unverschlüsselte Teile auf einer HTTPS-Seite. Bilder, Skripte oder Stylesheets werden über http geladen. Im selben Netz lassen sie sich austauschen. - `code.debug_output` (warn): Fehlermeldung sichtbar. Text, der wie eine technische Fehlermeldung aussieht, etwa ein Stack Trace oder eine PHP-Warnung. Er verrät oft Pfade und Versionen. - `code.sri.missing` (info): Fremde Skripte ohne Fingerabdruck (SRI). Skripte mit fester Version (etwa von einem CDN) ohne das Attribut integrity. Wird der Server manipuliert, läuft der veränderte Code mit. Dienste, deren Skript sich laufend ändert, zählen nicht, dort geht SRI nicht. - `code.sourcemap` (info): Quellcode möglicherweise lesbar (Source Map). Das HTML verweist auf eine .map-Datei. - `code.sensitive_paths` (info): Verweise auf heikle Dateien. Pfade wie .env, .git oder Sicherungsdateien stehen im HTML. Wir rufen sie nicht ab. ### Datenschutz (DSGVO) - `privacy.google_fonts` (warn): Google Fonts von Google-Servern. Schriften von fonts.googleapis.com oder fonts.gstatic.com, gefunden im HTML, in den Stylesheets oder in den JavaScript-Dateien. Bei deutschsprachigen Seiten eine Warnung, sonst und wenn die Adresse nur im JavaScript steht ein Hinweis. - `privacy.tracking_cookies` (warn): Tracking-Cookies vor der Einwilligung. Der Server setzt schon in der ersten Antwort Cookies zum Messen oder für Werbung, etwa _ga, _fbp oder _gcl_au. - `privacy.tracking_no_consent` (warn): Tracking ohne erkennbares Einwilligungs-Tool. Die Seite lädt Tracker wie Google Analytics, Meta Pixel oder Hotjar, ein Einwilligungs-Tool finden wir nicht. Nur der Google Tag Manager ist ein Hinweis, weil er die Einwilligung selbst steuern kann. - `privacy.third_party_embeds` (info): Eingebettete Inhalte ohne Einwilligung. YouTube, Google Maps oder Vimeo stehen direkt als iframe in der Seite und laden beim Aufruf. - `privacy.legal_links` (info): Impressum oder Datenschutzerklärung nicht verlinkt. Auf der Startseite einer deutschsprachigen Seite fehlt der Link. Nur geprüft, wenn das HTML selbst Links enthält. ### Cookies - `cookie.secure.missing` (info): Cookie ohne Secure. Ein Cookie, dessen Name nach Sitzung oder Anmeldung aussieht, darf auch unverschlüsselt mitgeschickt werden. - `cookie.httponly.missing` (info): Cookie ohne HttpOnly. Ein Cookie, dessen Name nach Sitzung oder Anmeldung aussieht, ist für Skripte lesbar. Fremder Code könnte damit das Konto übernehmen. ## Endpunkte - [Website prüfen](https://hullwise.co/docs/api#scan-website): GET /api/v1/scan, POST /api/v1/scan (MCP-Tool scan_website) - [Prüfpunkte anzeigen](https://hullwise.co/docs/mcp#tools): nur als MCP-Tool list_checks - [Website prüfen ohne Schlüssel](https://hullwise.co/docs/api#scan-web): GET /api/scan (für den Browser, kein Schlüssel)