Hluboká témata
Témata, která AI nástroje za tebe nevyřeší: autorizace, regulace, retenční doby. Vysvětleno na konkrétních případech a sankcích.
Přístupy a IDOR
Autentizace není autorizace — největší slepé místo vibecoded appek
Login funguje. Uživatel se přihlásí, UI vypadá správně. Ale pod kapotou API ani databáze neověřují, zda přihlášený uživatel smí číst právě tato data. To je IDOR — Insecure Direct Object Reference — a je to nejčastější zranitelnost v aplikacích postavených vibe codingem.
Jak IDOR vypadá v praxi
Tvoje appka má endpoint /api/orders/123. Přihlášený uživatel A si zobrazí svou objednávku. Změní v URL 123 na 124 — a vidí objednávku uživatele B. Login fungoval, ale API nekontroluje vlastnictví záznamu.
AI coding nástroje toto typicky neřeší. Vygenerují funkční CRUD s autentizací (přihlášení), ale autorizaci (kdo smí co vidět) musíš zadat ty.
Moltbook — jak to vypadá ve skutečnosti
Moltbook byla AI sociální síť postavená kompletně vibe codingem. Zakladatel veřejně uvedl, že nenapsal jediný řádek kódu. Výzkumníci z Wiz Research otevřeli stránku v prohlížeči, zmáčkli F12 a v DevTools našli v JavaScript bundlu hardcoded Supabase credentials. S tímto klíčem zavolali Supabase API přímo — bez dalšího přihlášení — a získali plný čtecí i zápisový přístup ke kompletní produkční databázi: 1,5 milionu API tokenů, 35 000 e-mailových adres, soukromé zprávy.
Žádný sofistikovaný útok. Žádný exploit. Jen F12 a veřejně dostupný klíč bez Row Level Security.
Chybový řetězec krok za krokem:
- Wiz otevřel moltbook.com v prohlížeči a přes DevTools (F12) inspektoval načtené JavaScript soubory.
- V Next.js static chunku našel hardcoded Supabase credentials: URL projektu + API klíč.
- S tímto klíčem zavolal Supabase API přímo — bez jakékoli autentizace — a získal plný přístup ke všem tabulkám.
- Databáze obsahovala 1,5 mil. API tokenů, 35 000 e-mailů a soukromé zprávy.
- Bonus: za 1,5 mil. „AI agentů“ stálo jen 17 000 lidí (poměr 88:1). Žádný rate limiting, žádná validace.
Supabase a RLS — co AI nástroje neudělají za tebe
Lovable generuje Supabase integraci včetně auth. Ale Row Level Security (RLS) nezapne automaticky — musíš to udělat ručně nebo to zadat AI jako explicitní požadavek.
Tři věci, které Supabase RLS neochrání automaticky:
service_roleklíč v client bundlu — tento klíč obchází RLS kompletně. Nikdy nesmí být ve frontend kódu. Používej ho výhradně na serveru (Edge Functions, backend).- Views bez
security_invoker = true— Supabase Views defaultně obcházejí RLS. Pokud vytvoříš View, musíš explicitně nastavitsecurity_invoker = true, jinak View vrací data všech uživatelů bez ohledu na RLS policies. - Anon klíč s příliš volnými policies — anon klíč je veřejný (je ve frontend bundlu). RLS policies musí být napsané tak, že s anon klíčem uživatel vidí jen svá vlastní data.
Jak ověřit: negativní test přístupů
Přihlas se jako uživatel A. Pak přes DevTools nebo curl zkus přečíst data uživatele B:
- Otevři DevTools → Network → najdi API volání na Supabase.
- Zkopíruj request a změň ID záznamu na záznam jiného uživatele.
- Pokud dostaneš data — RLS nefunguje.
Pro Supabase konkrétně: přihlas jako user A, pak přes anon klíč zavolej supabase.from('table').select('*') — pokud vrací záznamy jiných uživatelů, RLS není správně nastavený.
Čísla
40–62 % kódu vygenerovaného AI nástroji obsahuje bezpečnostní zranitelnost. Přístupy a IDOR patří mezi nejčastější.
Escape.tech proskenoval 5 600+ vibecoded aplikací a našel 400+ secretů přímo ve frontend kódu (OpenAI, Stripe, Supabase klíče).
- Wiz Research — Moltbook (2026-02-02): wiz.io/blog/exposed-moltbook-database-reveals-millions-of-api-keys
- Escape.tech — vibecoded apps secrets: escape.tech
- Supabase RLS: supabase.com/docs/guides/auth/row-level-security
Secrets — frontend není trezor
Frontend není trezor, repozitář není trezor, prompt není trezor
API klíč, service-role token nebo databázová URL — pokud je to v kódu, je to veřejné. Tři místa, kde secrets nejčastěji unikají:
1. Frontend JavaScript bundle
Cokoliv v client-side JS si kdokoliv může stáhnout nebo prozkoumat v DevTools. To platí i pro .env proměnné, které framework (Next.js, Vite) vloží do client bundlu — prefix NEXT_PUBLIC_ nebo VITE_ znamená „toto bude veřejné“.
Escape.tech proskenoval 5 600+ vibecoded aplikací a našel 400+ secretů v frontend kódu: OpenAI API klíče, Stripe secret keys, Supabase service_role tokeny.
service_role klíč: obchází veškerou Row Level Security a dává plný přístup k celé databázi. Nikdy do frontend bundlu — používej výhradně v Edge Functions nebo backend kódu.
2. Git historie
Co je v gitu, je tam navždy — i po smazání souboru. Secret commitnutý omylem zůstává v historii repozitáře. Pokud je repo veřejné, stačí git log a secret je venku. I v privátním repu: kdokoliv s přístupem vidí celou historii.
Řešení: .env v .gitignore od prvního commitu. Pokud se secret dostal do git historie, rotuj klíč (vygeneruj nový) — mazání z historie (git filter-branch, BFG) je nespolehlivé.
3. Prompt do AI nástroje
Vložíš API klíč do promptu pro Claude Code, Cursor nebo ChatGPT? Data odchází na cloud servery AI providera. Pokud nemáš opt-out z trénování, klíč se může stát součástí trénovacích dat.
Řešení: AI při generování kódu nepotřebuje znát hodnotu secretu. Stačí jí říct: „pro Stripe použij os.getenv('STRIPE_SECRET_KEY')“. AI napíše kód, který bude proměnnou číst za běhu — samotná hodnota nikdy neopustí tvůj systém směrem k AI provideru.
.env a ta se vrátí do kontextu konverzace přes výstup nástrojů. Pro běhové testy s reálnými secrets používej výhradně účet s DPA a vypnutým trénováním, nebo použij sandbox/test secrety (sk_test_..., test API klíče).
Checklist před deployem
Před každým nasazením prohledej kód na tyto vzory:
grep -rn "service_role\|sk_live\|sk_test\|OPENAI_API_KEY\|Bearer \|JWT\|SMTP_PASS\|TELEGRAM_TOKEN\|STRIPE_SECRET\|DATABASE_URL\|SUPABASE_SERVICE" --include="*.js" --include="*.ts" --include="*.jsx" --include="*.tsx" --include="*.py" --include="*.env" .
Pokud hledáš ve výstupu Next.js / Vite buildu:
grep -rn "sk_live\|service_role\|OPENAI_API_KEY" .next/ dist/ build/
Pro automatizaci: nastav gitleaks nebo trufflehog v CI/CD — skenují každý commit automaticky.
Správné uložení secrets
| Kde | Příklad |
|---|---|
.env soubor (lokální vývoj) | STRIPE_SECRET_KEY=sk_live_... |
| Secret manager (produkce) | Vercel Environment Variables, AWS Secrets Manager, Railway Variables |
| Oddělené klíče dev/prod | Dev API klíč pro testování, produkční klíč jen na serveru |
| Rotace | Při podezření na únik okamžitě vygeneruj nový klíč |
Základní pravidlo: .env musí být v .gitignore. .env.example s placeholder hodnotami commitni do repa, aby nový vývojář věděl jaké proměnné potřebuje.
- Escape.tech — exposed secrets in vibecoded apps: escape.tech
- gitleaks: github.com/gitleaks/gitleaks
- trufflehog: github.com/trufflesecurity/trufflehog
AI nástroje a GDPR
Scanner vidí výstup. Proces tvorby webu může uniknout vedle.
Tvůj klient ti pošle podklady — jméno, e-mail, telefon, IČO, smlouvu. Otevřeš ChatGPT (osobní účet), zkopíruješ text a požádáš o pomoc s článkem na web. Výsledná stránka je čistá: žádný personal data leak v HTML, hezké headery, SSL OK. Ale data klienta už unikla — odešla do OpenAI, kde se mohou stát součástí trénovacího datasetu.
Vibescan tohle nezachytí. Žádný scanner tohle nezachytí. Stalo se to při vývoji, ne v produkci.
Co dělají AI nástroje s tvými prompty
Většina AI služeb v consumer režimu (osobní účet, free/plus tier) defaultně trénuje na uživatelských vstupech. Opt-out je obvykle možný, ale musíš ho aktivně zapnout. Business/Enterprise tiery typicky netrénují by default a nabízejí DPA (Data Processing Agreement).
Chatboti a AI asistenti — trénují na tvých datech?
| Nástroj | Trénuje by default? | Jak vypnout / poznámka |
|---|---|---|
| ChatGPT Free / Go / Plus / Pro ($100/$200) | ⚠ ANO (default ON) | Settings → Data Controls → vypnout „Improve the model for everyone“ |
| ChatGPT Team | NE | Netrénuje by default, DPA dostupná |
| ChatGPT Enterprise | NE | Netrénuje, DPA, SSO, audit log |
| Claude (Free / Pro) | NE (opt-in) | Anthropic netrénuje na konverzacích by default |
| Claude Team / Enterprise | NE | Netrénuje, DPA |
| Anthropic API | NE (opt-in) | Pouze pokud se přihlásíš do programu zlepšování modelu |
| Gemini (osobní Gmail) | ⚠ ANO (default ON) | Vypnout „Gemini Apps Activity“. Pozor: reviewnuté chaty Google uchovává 3 roky i PO smazání (ne 18 měs. default) |
| Gemini Workspace (Business / Enterprise) | NE | Netrénuje, pokrytí Workspace DPA |
| GitHub Copilot Business / Enterprise | NE | Netrénuje na promptech ani sugescích, DPA |
| GitHub Copilot Free / Pro (Consumer) | ⚠ ANO (opt-out přes support) | Opt-out vyžaduje žádost na GitHub support |
| Mistral Le Chat (osobní) | ⚠ ANO (default ON) | Opt-out v Account Settings |
| Perplexity (osobní) | ⚠ ANO (default ON) | Opt-out: Settings → Account → Privacy → AI Data Retention |
| Ollama (lokální) | NE | Nikdy neopouští tvůj počítač |
DPA s AI providery a hostingem
DPA (Data Processing Agreement) je smlouva podle GDPR čl. 28 mezi tebou (správce) a providerem (zpracovatel). Bez DPA nesmíš provideru předávat osobní data klienta v rámci své činnosti. Consumer účty DPA neposkytují — je to business feature.
| Provider | Poskytuje DPA? | Poznámka |
|---|---|---|
| OpenAI (Team / Enterprise / API) | Ano | DPA podepsatelná v admin konzoli. ChatGPT Free / Plus / Pro DPA NEMAJÍ — consumer tier |
| Anthropic (Team / Enterprise / API) | Ano | DPA k podpisu pro Team+ tiery |
| Google (Workspace / Vertex AI) | Ano | DPA platí pro Workspace a Vertex. Osobní Gemini / Bard z osobního Gmailu DPA NEMÁ |
| GitHub Copilot Business / Enterprise | Ano | Automaticky součástí business plánu |
| AWS / GCP / Azure | Ano | Standardní DPA pro placené účty |
| Vercel | Ano (placené plány) | Pozor: Vercel Hobby tier trénuje na tvém kódu by default od 03/2026 (opt-out v nastavení projektu) |
| Netlify / Cloudflare | Ano (placené plány) | Free tier obvykle bez DPA — pro produkci s osobními daty nedostatečné |
| Railway / Render / Fly.io | Ano (placené plány) | Free / hobby tiery DPA obvykle neposkytují |
Lokální alternativa: Ollama
Ollama je výjimka — běží lokálně na tvém počítači, takže data nikdy neopouští systém. Žádné DPA nepotřebuje, žádný opt-out, žádné trénování.
Claude Code lze přesměrovat na lokální Ollama: ANTHROPIC_BASE_URL=http://localhost:11434 (funkční od Ollama v0.14, leden 2026). Kód pak zůstane lokální, ale výkon je výrazně nižší (7B–13B modely vs. Claude Sonnet/Opus).
Praktické omezení: Claude Code posílá ~18 K tokenů systémový prompt — výchozí kontext Ollama (4 K) nestačí. Nastav minimálně 64 K kontext přes Modelfile. Některé pokročilé funkce (prompt caching, count_tokens) nejsou podporovány.
Praktický checklist před každým AI promptem
- Obsahuje prompt osobní data (klienta, uživatele, zaměstnance)?
- Pokud ano, používám účet s vypnutým trénováním a s DPA?
- Pokud ne, mohu data anonymizovat (nahradit reálná jména/kontakty placeholderem)?
- Pokud anonymizovat nelze, je nutné AI vůbec použít? (Alternativa: lokální Ollama nebo manuálně.)
- OpenAI Privacy & Business terms: openai.com/policies
- Anthropic Privacy: anthropic.com/legal/privacy
- Google AI training settings: myactivity.google.com/product/gemini
- GitHub Copilot data privacy: docs.github.com
- GDPR čl. 28 (DPA): gdpr-info.eu/art-28
- GDPR čl. 33 (ohlášení úniku): gdpr-info.eu/art-33
NIS2 / ZoKB — klientské riziko
Tvoje appka může být něčí rizikový dodavatel
Vibecoded interní nástroj za víkend drží CRM/HR data a běží na osobních AI účtech. Pro tebe je to prototyp. Pro tvého klienta — pokud je regulovaný subjekt — jsi článek v dodavatelském řetězci.
Co je ZoKB
ZoKB (zákon č. 264/2025 Sb.) je česká transpozice EU směrnice NIS2 (2022/2555). Účinný od 1. 11. 2025. Rozšiřuje povinnosti kybernetické bezpečnosti z původních stovek subjektů na 6–10 tisíc organizací v ČR. Dohled: NÚKIB.
Koho se týká
Poskytovatelé regulovaných služeb v 15 sektorech: energetika, doprava, bankovnictví, zdravotnictví, digitální infrastruktura, ICT správa, pitná/odpadní voda, veřejná správa, výroba, poštovní služby, odpady, digitální poskytovatelé (cloud, tržiště) a další.
Základní práh: střední podnik (50+ zaměstnanců, obrat 10M+ EUR). Kritické subjekty bez ohledu na velikost.
Proč se tě týká, i když nejsi regulovaný
NIS2/ZoKB zavádí povinnost řízení dodavatelského řetězce. Regulovaný subjekt musí posoudit bezpečnost svých dodavatelů — včetně tvé appky, pokud zpracovává jeho data.
Tvůj interní nástroj na Supabase + osobní Claude Code účet:
- Zpracovává CRM/HR data klienta, který spadá pod ZoKB.
- Nemá DPA s AI providerem (osobní účet = consumer terms = trénování ON).
- Nemá dokumentovanou bezpečnostní politiku.
- Běží na free tier hostingu bez SLA.
Odpovědnost vedení
ZoKB zavádí osobní odpovědnost vedení: ředitel se nemůže vyvinit tvrzením „o ničem jsem nevěděl“. Pokud schválí nasazení nástroje bez bezpečnostního posouzení, nese odpovědnost.
Pokuta
Co to znamená pro vibecoded appku
Bezpečnostní dokumentace bez bezpečné appky nestačí — a naopak. Pokud tvoje appka zpracovává data pro regulovaný subjekt:
- Musíš mít DPA s každým AI providerem a sub-procesorem.
- Musíš mít dokumentovanou bezpečnostní politiku (přístupy, secrets, zálohy, incident response).
- Firemní AI účty (Team/Enterprise) místo osobních — jinak data klienta mohou jít do trénování.
- Bezpečnostní testování — minimálně self-review, ideálně SAST/secret scan v CI/CD.
- Zákon č. 264/2025 Sb. (ZoKB): zakonyprolidi.cz/cs/2025-264
- Směrnice EU 2022/2555 (NIS2)
- NÚKIB: nukib.gov.cz
Retence dat — case law
Reálné pokuty bez jediného úniku dat
GDPR čl. 5(1)(e) říká: osobní data smaž, jakmile pominul účel. GDPR ale nestanovuje konkrétní doby — ty vycházejí z judikatury CNIL (francouzský úřad), která se de facto uplatňuje v celé EU.
CNIL pokuty za retenci
| Případ | Pokuta | Co se stalo |
|---|---|---|
| Free Mobile (CNIL, 2026) | 27 mil. EUR | Výlučně za retenci. Žádný únik dat — jen držel osobní data déle, než měl právní důvod. |
| Discord (CNIL, 2022) | 800 tis. EUR | 2,4 mil. účtů neaktivních >3 roky + 58 tis. >5 let. Discord neměl žádnou dokumentovanou retenční politiku. |
| Spartoo (CNIL, 2020) | 250 tis. EUR | 3 mil. záznamů zákazníků neaktivních od 2013. 5-letá retence prospektů — a pozor: otevření e-mailu NENÍ platný kontakt. |
| PAP real estate (CNIL, 2024) | 100 tis. EUR | 10-letá retence bez zdůvodnění, neaktivní účty nesetřídeny. |
Pravidlo „smysluplný kontakt“
Dobu retence „prospect (registrovaný, nekoupil): max. 3 roky od posledního přihlášení“ zpřesnit takto: max. 3 roky od posledního smysluplného kontaktu.
Otevření e-mailu NENÍ platný kontakt (CNIL vs. Spartoo). Platný kontakt = přihlášení, nákup, odeslání formuláře, aktivní interakce.
- CNIL judikatura: Free Mobile (2026), Discord (2022), Spartoo (2020), PAP (2024)
- EDPB, leden 2025: GDPR nestanovuje konkrétní doby retence
- EDPB, únor 2026: 4. CEF — retence jako priorita