
CLI-Scanner, der geleakte API-Schlüssel, Tokens und Zugangsdaten in Quellcodebäumen und bereitgestellten Web-Apps erkennt, mit Prüfungen auf Fehlkonfigurationen bei Supabase/Firebase und SARIF-Ausgabe.
Finde heraus, was deine Vibe-Coding-App preisgibt – bevor es jemand anderes tut.
KI-App-Builder (Lovable, Bolt, Cursor, v0, …) liefern schnell aus und oft mit einer
weitreichend offenen Datenbank oder einem geheimen Schlüssel im JavaScript-Bundle. keydra
untersucht deine bereitgestellte App so, wie es ein Außenstehender tun würde, oder deinen
Quellcode-Baum vor dem Deployment, und sagt dir, was exponiert ist – mit einer
Copy-and-paste-Lösung.
[!IMPORTANT] keydra ist in erster Linie als eigenständiges CLI-Tool konzipiert. Der Betrieb von keydra als öffentlich zugänglicher Dienst kann sensible Daten offenlegen und Sicherheitsrisiken mit sich bringen. Verwende es mit Vorsicht und implementiere geeignete Sicherheitskontrollen.
$ keydra scan https://my-app.example.com
█▄
▄▄ ██ ▄
██ ▄█▀ ▄█▀█▄ ██ ██ ▄████ ████▄▄▀▀█▄
████ ██▄█▀ ██▄██ ██ ██ ██ ▄█▀██
▄██ ▀█▄▄▀█▄▄▄▄▄▀██▀▄█▀███▄█▀ ▄▀█▄██
██ v1.0.0
▀▀▀
Keydra — find what your vibe-coded app is leaking.
keydra: only scan apps you own or have permission to test.
url https://my-app.example.com
2 pages · 14 files scanned · 2.1s
1 [Supabase] Supabase table "profiles" is publicly readable
│ The table can be read with the public anon key. ...
│ evidence GET /rest/v1/profiles → 206, rows visible to anonymous role: 1204
│ fix alter table public.profiles enable row level security; …
1. Go installieren. Sie benötigen Go 1.27 oder neuer (go version zur Prüfung; Download unter
https://go.dev/dl). Mit Go 1.21+ wird die richtige Toolchain automatisch
basierend auf go.mod abgerufen.
2. Den Code abrufen und bauen.
unzip keydra.zip && cd keydra # or: git clone <your repo> && cd keydra
go build -o bin/keydra ./cmd/keydra # or: make build
Windows (PowerShell): go build -o bin\keydra.exe ./cmd/keydra
Du musst das Modul nicht umbenennen, um lokal zu bauen. Ersetze
github.com/drau6/keydra nur dann durch deinen eigenen Pfad, wenn du das Repo veröffentlichst
(oder wenn du möchtest, dass go install github.com/<you>/keydra/cmd/keydra@latest funktioniert).
3. Führe deinen ersten Scan aus.
# source code, before you deploy: safe, no network
./bin/keydra scan --repo .
# a deployed app you own (or have written permission to test)
./bin/keydra scan https://my-app.example.com
# also follow internal links, because secrets often hide on /admin or /dashboard
./bin/keydra scan https://my-app.example.com --depth 2
# see every check Keydra performs
./bin/keydra rules
4. Optional: Auf deinem PATH installieren.
go install ./cmd/keydra # installs to $(go env GOPATH)/bin
keydra version
5. Optional: Tests ausführen. go test ./... (oder make test).
Hinweise: Farben werden in einem Terminal automatisch aktiviert. Unter dem veralteten Windows cmd.exe
können rohe Escape-Codes angezeigt werden; verwenden Sie Windows Terminal/PowerShell oder --no-color.
Das große Banner wird übersprungen, wenn die Ausgabe über eine Pipe läuft, wenn das Terminal schmaler
als das Banner ist (COLUMNS) oder mit --no-banner.
go install github.com/drau6/keydra/cmd/keydra@latest
(nachdem Sie yourname ersetzt und das Repository gepusht haben) oder make build und verwenden Sie
bin/keydra.
keydra scan <url> [flags] # scan a deployed app
keydra scan --repo <dir> [flags] # scan source before you deploy
keydra scan --list <file> [flags] # scan every URL in the file, one per line (max 50)
keydra rules # list every check
keydra <url> # shortcut for scan
--repo <dir> scan a local source tree instead of a URL (no network)
--list <file> scan a list of URLs, one per line (# comments and blank lines ignored, max 50)
--format <fmt> text | json | sarif (default text); --json is a shortcut
--no-banner one-line title instead of the ASCII-art banner
--color <mode> auto|always|never (honors NO_COLOR and FORCE_COLOR; --no-color also works)
--no-probe static analysis only, never contact discovered backends
--validate opt-in: ask each provider (one read-only request) whether a detected secret is still active
--fail-on <sev> exit 1 at/above severity: info|low|medium|high|critical|never (default high)
--depth N page levels to crawl in URL mode: 1 = only the given page (default),
2 = also its internal links, up to 5
--max-pages N maximum HTML pages to fetch in URL mode (default 20, max 200)
--sitemap also scan pages listed in /sitemap.xml
--max-files N JS files to download in URL mode (default 40)
--third-party also scan scripts hosted on other origins
--timeout 15s per-request timeout
-v show full fix snippets
Exit-Codes: 0 sauber, 1 Findings ab/über --fail-on, 2 Fehler. Mit
--list bedeutet 2 auch „mindestens ein Ziel konnte nicht gescannt werden" (es sei denn, Findings
haben bereits Exit 1 erzwungen).
Ein Repo-Scan einer kleinen vibe-codierten App (--no-color --no-banner; auf einem
interaktiven Terminal ist das Banner ASCII-Art und der │-Rand ist nach
Schweregrad eingefärbt — rot kritisch, orange hoch, blau niedrig):
KEYDRA v1.0.0
keydra: only scan apps you own or have permission to test.
repo my-app
3 files scanned · 1ms
1 [Supabase] Supabase service/secret key exposed in client code
│ This key bypasses Row Level Security. Whoever holds it has full read/write access to the whole database.
│ evidence eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImFiY2RlZmdoaWowMTIzNDU2Nzg5Iiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTc0OTgxODI0OSwiZXhwIjoyMDY1Mzk0MjQ5fQ.AAAAAAAAbbbbbbbbCCCCCCCCddddddddEEEEEEEE
│ fix Rotate the key in Supabase → Project Settings → API now, remove it from the frontend and use it only from server-side code.
2 [Repository] .env is not covered by .gitignore
│ Environment files normally hold server secrets. If this file is committed, every secret in it is in your git history.
│ where .env
│ fix Add ".env*" and "!.env.example" to .gitignore. If it was already committed: `git rm --cached .env`, then rotate every key inside and purge history.
3 [Secrets] Possible unnamed secret (high-entropy string) exposed in client code
│ This value ships to every visitor's browser and can be copied by anyone.
│ evidence eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImFiY2RlZmdoaWowMTIzNDU2Nzg5Iiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTc0OTgxODI0OSwiZXhwIjoyMDY1Mzk0MjQ5fQ.AAAAAAAAbbbbbbbbCCCCCCCCddddddddEEEEEEEE
│ where lib/api.js
│ fix Keydra found a long, random-looking string that matches no known key format. Check whether it is a credential: if so, rotate it and move it server-side. Build artifacts such as hashes or encoded assets can be ignored.
note: Supabase configuration found in source; run `keydra scan <deployed-url>` to test the live backend
Jeder Fund zeigt den gefundenen Wert vollständig (Nachweis), wo er gefunden wurde, und eine Copy-Paste-Korrektur — ein Scan-Bericht ist also alles, was Sie benötigen, um mit der Behebung zu beginnen. Die oben genannten Werte sind Beispiele, keine echten Schlüssel.
Standardmäßig wird nur die von Ihnen angegebene Seite gescannt (plus ihre Skripte, Lazy Chunks und
Source Maps). Verwenden Sie --depth, um internen Links zu folgen, und --sitemap, um die
Seiten hinzuzufügen, die eine Website in /sitemap.xml auflistet:
keydra scan https://my-app.example.com --depth 3 --max-pages 40
keydra scan https://my-app.example.com --sitemap