// docs / security guides / pre-ship checklist
Vibe coding güvenlik kontrol listesi: gönderim öncesi 51 madde
Cursor, Claude Code, Lovable, Bolt, v0, Replit ve Windsurf ile oluşturulan uygulamalar için pratik, aşamalara göre düzenlenmiş bir kontrol listesi. Her öğe beş dakikadan kısa sürede işleme koyulabilir. Üretime geçmeden önce, ardından her büyük sürümden önce tekrar gözden geçirin. Öğeler yedi kategoride (gizli diziler, veritabanı, kimlik doğrulama, başlıklar, üçüncü taraf, dağıtım, izleme) gruplandırılır ve uygulandıkları dağıtım aşamasıyla etiketlenir.
PRE = pre-deploy (audit your source). DEPLOY = at deploy time. POST = post-deploy verification.
Sırlar ve API tuşları (8 öğe)
Sabit kodlanmış anahtarlar, titreşim kodlu uygulamalarda en yaygın bulunan tek bulgudur. Onları uzak tutacak sekiz öğe:
- PRE — Audit
NEXT_PUBLIC_env vars.NEXT_PUBLIC_ön ekine sahip her şey istemci paketleri halinde gönderilir. Bunlardan biri Supabaseservice_roleanahtarıysa ("role":"service_role"ile JWT olarak çözülür), onu silin ve yalnızca sunucu istemcisi (src/lib/supabase/service.tsileimport 'server-only') aracılığıyla yönlendirin. - PRE — Grep for hardcoded provider keys.
sk_live_,pk_live_,STRIPE_SECRET,sk-ant-,sk-,AIza,AKIAve JWT-görünüm dizeleri (eyJ) için kaynak arayın. Her isabeti.env.localiçine taşıyın ve yalnızcaprocess.env.*sunucu tarafı aracılığıyla referans verin. - PRE — Verify
.gitignore..env*.local,.npmrc,.yarnrconaylayın; sağlayıcıya özel kimlik bilgileri dosyaları yoksayılır. Halihazırda taahhüt edilmiş herhangi bir şeyi bulmak için sağlayıcı kalıplarınız üzerindengit ls-fileskanalını çalıştırın. - PRE — Scan the built bundle.
npm run buildkomutunu çalıştırın, ardından grep.next/staticve aynı modeller için herhangi birdist/çıktısını çalıştırın. Bir anahtar pakete ulaşırsa geliştiricinin hiçbir zaman temiz bir ortam ayrımı olmadı. - DEPLOY — Set secrets per environment. Vercel: Ayarlar → Ortam Değişkenleri, her birinin kapsamını Prodüksiyon / Önizleme / Geliştirme olarak belirleyin.
sk_live_*'yi asla Önizleme ortamıyla paylaşmayın. Satır içi iş akışı sırlarını değil, Vercel'nin şifrelenmiş env-var depolama alanını kullanın. - DEPLOY — Disable build-log secret echo. Bazı CI yapılandırmaları
echoenv, derleme sırasında değişiklik gösterir. Değeri genel derleme günlüklerine aktaracak herhangi birecho $SECRETiçinvercel.json, GitHub Eylemler iş akışlarınızı veya Cloudflare Sayfa ayarlarınızı denetleyin. - POST — Run a passive scan. FixVibe'nin Free katmanı şunu kapsar: dağıtılan URL'yi yapıştırın, yaklaşık 20 saniye bekleyin,
secrets.*bulgularını arayın. Secrets in JavaScript Bundles kontrolü, SDK'nin yanlış kullanımı yoluylalocalStorageveyasessionStorage'ye gelen anahtarları yakalar. - POST — Rotate any key that ever shipped. Bir anahtar, halka açık bir pakette birkaç dakika boyunca kaldıysa, onu tehlikeye atılmış olarak değerlendirin. Kontrol paneli aracılığıyla Supabase hizmet rolü anahtarlarını döndürün, Stripe kısıtlı anahtarları yeniden oluşturun, konsolları aracılığıyla Anthropic / OpenAI / Google anahtarlarını iptal edin.
Veritabanı erişim kontrolü: RLS ve Firestore kuralları (6 öğe)
BaaS varsayılanları bilinçli olarak izinlidir, bu nedenle ilk eğitim çalışır. Production açık politikalara ihtiyaç duyar.
- PRE — Enable RLS on every
public.*table. In Supabase: each table needsALTER TABLE ... ENABLE ROW LEVEL SECURITYplus explicit policies for each role. RLS is what stops theanonandauthenticatedAPI roles;FORCE ROW LEVEL SECURITYonly extends it to the table owner and is optional defence in depth. - PRE — Write a policy per (table, role, action). Minimum:
auth.uid()ile birleşen bir SELECT politikası. Daha iyi: INSERT / UPDATE / DELETE politikalarını ayırın, böylece bir UPDATE, sahipliği yeniden yönlendirenuser_iddeğişikliklerine gizlice giremez. - PRE — Replace default Firebase rules. Varsayılan test modu kuralları
allow read, write: if true;şeklindedir. Koleksiyon başına kimlik doğrulama kurallarıyla değiştirin:match /users/{userId}ileallow read, write: if request.auth.uid == userId; - PRE — Lint migrations in CI. Birleştirmeden önce
supabase db lintveya eşdeğerini çalıştırın. Herhangi birCREATE TABLE public.*'de eşleşen bir RLS politikası yoksa, CI derlemede başarısız olmalıdır. - DEPLOY — Confirm RLS survived deploy. Dağıtımdan sonra Supabase Studio'da yeniden kontrol edin: Tablolar → her satır → RLS geçişi ON'dir. Production veritabanı geçişleri zaman zaman politika dosyalarının önünde yarışır; Politikanın yayında olduğunu doğrulayın.
- POST — Run an active scan against a verified domain. Supabase Row-Level Security aktif kontrolü, anon anahtarını kullanarak küçük bir tohum satırına yazar ve yazmanın başarılı olup olmadığını bildirir — i.e. RLS aslında zorunlu değildir.
Kimlik doğrulama ve oturumlar (7 öğe)
AI- kodlu uygulamalardaki kimlik doğrulama hataları genellikle incelikli olma eğilimindedir: belirteç doğrulamasında tek tek, kaçırılan bir HttpOnly işareti, getUser() olması gereken bir getSession().
- PRE — Replace
getSession()withgetUser().getSession()çerezi okur ve ona güvenir;getUser(), Supabase arka ucuyla doğrulanır. Sunucu rotalarında her zamangetUser()kullanın. - PRE — Confirm token expiry. Magic-link, şifre sıfırlama ve e-posta doğrulama belirteçlerinin sunucu tarafından zorunlu kılınan sürelerinin sona ermesi gerekir. Varsayılan Supabase sihirli bağlantıların süresi 1 saat sonra dolar; gerçek bir neden olmadan bunu daha yüksek bir sayıya geçersiz kılmayın.
- PRE — Verify JWT
audandexp. Belirteçlerin kodunu herhangi bir yerde manuel olarak çözerseniz her iki talebi de kontrol edin. Daha iyisi: bunu sizin için yapan SDK'ningetUser()özelliğini kullanın. - PRE — Audit cookie flags. Özel oturum çerezleri
Secure; HttpOnly; SameSite=Lax(veya OAuth olmayan akışlar içinStrict) olmalıdır.localStorage'de oturum materyali yok. - PRE — Validate the
nextredirect param. Oturum açtıktan sonrakinextsorgu parametresi//ile değil/ile başlamalıdır (açık yönlendirme attacker.example'ye). Sunucu tarafındaki diğer her şeyi reddedin. - POST — Test logout. Oturum açın, oturumu kapatın, çerezleri inceleyin (DevTools → Uygulama → Çerezler). Oturum çerezinin aynı yanıtta temizlenmesi gerekir. Devam ederse, oturum kapatma işleyicisi aslında sunucu tarafı durumunu bozmuyordur.
- POST — Active probe. Auth Flow Defects ve Account Enumeration yüzeydeki bozuk kimlik doğrulama sınırlarını kontrol eder; "kullanıcı mevcut" ve "yanlış şifre" ile ilgili farklı yanıtlar, oturum açma sırasında eksik hız sınırı, imzasız sıfırlama belirteçleri.
HTTP güvenlik başlıkları ve İçerik Güvenliği Politikası (6 öğe)
Başlıklar, tüm işlem hattındaki en ucuz sertleştirmedir ve codegen tarafından en tutarlı şekilde atlanır.
- PRE — Ship a real CSP. Minimum:
script-src 'nonce-{NONCE}' 'strict-dynamic'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'.script-src'de'unsafe-inline'yok. Next.js, ara yazılımx-nonceistek başlığını ayarladığında nonce'ı otomatik olarak uygular. - PRE — Add the legacy three.
X-Content-Type-Options: nosniff,X-Frame-Options: DENY(veya yalnızca CSPframe-ancestors'ye güvenin),Strict-Transport-Security: max-age=31536000; includeSubDomains. - PRE — Tighten
Referrer-Policy. Varsayılanstrict-origin-when-cross-originçoğu uygulama için uygundur.unsafe-urlgöndermeyin veya hiç başlık göndermeyin. - PRE — Replace
Access-Control-Allow-Origin: *. Bunun için Grep'i kullanın. Açık bir kaynak izin verilenler listesiyle değiştirin.credentials: includeile birlikte*olduğu her yerde, tarayıcı isteği reddedecektir; ancak bu, yanlış yapılandırılmış bir arka uca karşı bir savunma değildir. - DEPLOY — Verify headers post-deploy. DevTools → Ağ'ı açın → kök belgenize → Başlıklar sekmesine tıklayın. CSP, HSTS, X-Frame-Options, X-Content-Type-Options mevcut olmalıdır. CSP,
script-srciçinde'unsafe-inline'içermemelidir. - POST — Run HTTP Security Headers. Pasif başlık kontrolü, eksik olan her başlığı dağıtım platformu düzeltme kılavuzuyla birlikte rapor eder (Vercel
vercel.json, Cloudflare Pages_headers, Netlify_headers, Next.js ara katman yazılımı).
Üçüncü taraf entegrasyonları ve APIs (5 öğe)
Eklediğiniz her komut dosyası bir CSP muafiyeti ve potansiyel bir tedarik zinciri yüzeyidir. Üçüncü taraflara güven sınırınızın bir parçası olarak davranın.
- PRE — Reverse-proxy analytics where possible. PostHog, Plausible, Umami'nin tümü kendi etki alanınız (e.g.
/api/posthog) üzerinden proxy kullanmayı destekler. Bu,connect-src'yi aynı kaynakta tutar ve reklam engelleyicilerden kurtulur. - PRE — CSP-allowlist the rest. Google Analytics, Stripe.js, Sentry, Intercom, GTM vb. için her satıcının kaynağını eşleşen CSP direktifine ekleyin (
script-srcyükleyiciler için,connect-srctelemetri için,frame-srciframe'ler için,img-srcpikseller için). - PRE — Use Stripe Checkout, not raw card forms. Stripe Ödeme, üst düzey bir yönlendirmedir; komut dosyası için CSP girişine gerek yok. Barındırılan PCI yüzeyi tamamen Stripe alan adında bulunur. Yalnızca güçlü bir nedeniniz varsa kendinizinkini yuvarlayın.
- PRE — Lock
package-lock.jsonin CI. Üretim yapılarındanpm ci(npm installdeğil) komutunu çalıştırın. Bağımlılıkları her sürümden öncenpm auditveya Snyk ile denetleyin. - POST — Watch Technology Fingerprinting. Pasif teknoloji yığını keşfi, bir tarayıcının görebileceği kitaplık sürümlerini ortaya çıkarır. Bir EOL React, jQuery veya Bootstrap gönderirseniz, FixVibe onu işaretler ve bilinen CVE'lere bağlantı verir.
Dağıtım hijyeni ve altyapısı (8 öğe)
Ne dağıttığınız kadar nasıl dağıttığınız da önemlidir. AI-kodlu uygulamalar özellikle açık konuşlandırma sağlamlaştırmasından yararlanır.
- PRE — Disable
x-powered-by.next.config.jsiçinde:poweredByHeader: false. Ücretsiz sürüm açıklama sinyalini kaldırır. - PRE — Confirm middleware lives at
src/middleware.ts.src/dizin düzeniyle, Next.js, kök düzeyindekimiddleware.ts'yi yok sayar. Yanlış yerleştirilmiş ara yazılım, CSP / kimlik doğrulama başlıklarını / hız sınırlarını sessizce ayarlamayı başaramıyor. - PRE — Sanity-check Vercel deployment protection. Prodüksiyon herkese açık olmalıdır; Önizleme şifre korumalı olmalı veya kuruluş üyeleriyle sınırlı olmalıdır. Vercel-Specific Exposure yüzeyi bildirir.
- PRE — Block dotfile and config probes at the edge.
/.env,/.git/*,/.aws/*,/.next/tracedesenleri için yeniden yazma veya reddetme kuralı ekleyin. Vercel bunların çoğu için varsayılan olarak 403 değerini döndürür; çapraz kontrol. - DEPLOY — Separate environments. Prodüksiyon, Önizleme, Geliştirme. Her birinin kendine ait sırları vardır. Canlı tuşlar hiçbir zaman Önizleme'ye ulaşmaz, Stripe test modu asla Prodüksiyon'a ulaşmaz.
- DEPLOY — Enable Vercel Web Application Firewall. Pro ve Kurumsal planlar, yönetilen kurallara sahip WAF içerir. Cloudflare Pages'da Bot Dövüşü Modu bulunur. Her ikisi de otomatik tarayıcının kötüye kullanımını ve şifre püskürtme yükünü azaltır.
- Üretim alanınıza karşı POST — Verify TLS configuration. SSL Labs veya testssl.sh. TLS minimum 1,2, TLS 1,3'ü tercih edin, zayıf şifre yok, HSTS ön yüklemeye uygun.
- POST — Confirm health-check endpoints are minimal. Bir
/api/health, gövdesiz olarak200 OKdeğerini döndürmelidir. Kimlik doğrulaması olmadan ortamı yankılamayın, karma oluşturmayın veya zaman damgasını dağıtmayın.
Devam eden izleme ve yeniden tarama (4 öğe)
Güvenlik tek seferlik bir gemi öncesi denetimi değildir. Drift her konuşlandırmada gerçekleşir.
- Verify your production domain in FixVibe. Dashboard → Domains → DNS TXT or HTTP file verification. Active scans require Hobby or above, scheduled scans require Pro or Unlimited, and live threat monitoring requires Unlimited.
- Schedule passive re-scans on Pro or Unlimited. Choose an available cadence for your verified domain. Scheduled runs share your scan allowance; enable completion notifications and signed webhooks as needed. A scheduled scan observes the app at run time, not continuously.
- Wire outbound webhooks. Account → Webhooks → bir HTTPS uç noktası ekleyin,
scan.completed+finding.created+scan.active_api.first_used'ye abone olun. Slack / Discord / PagerDuty'ye yönlendirin. - Enable live threat monitoring on Unlimited. Periodic certificate, DNS, bundle, and threat-intelligence checks can surface changes between scheduled scans. Coverage and alert timing depend on the signal and successful polling.
Replit Agent
If you build with Replit Agent, also check:
- Don't paste keys into the Agent prompt. Add them in Secrets and give the Agent the variable name instead, so the value never appears in generated code or chat history.
- Test CORS on the production domain. The preview pane and your deployed URL are different origins. Check your CORS allowlist against the domain users actually load.
- Replit Agent sometimes hardcodes test values. Aracı,
API_URL = 'http://localhost:5000</code> ile kod oluşturabilir. Göndermeden önce <code>os.environ[API_URL']ile değiştirin.
Firebase Studio
If you build with Firebase Studio, also check:
- Test-mode rules are temporary by intent, not by default. Test mode lets anyone read and overwrite data. If the generated rule carries a date cutoff, client access stops on that date; if not, the database stays open. Replace test rules before launch either way.
- Security rules protect data, not Hosting. Firestore and Storage rules don't govern what Firebase Hosting serves: everything in the public directory is public. Keep exports, backups and admin pages out of it.
Claude Code
If you build with Claude Code, also check:
- PRE — Keep personal Claude Code settings out of git. Commit
.claude/settings.jsonfor shared project settings, but keep.claude/settings.local.jsonout of the repo: Claude Code excludes it from git when it creates the file, so check it if you created it by hand. Session history lives in~/.claude, outside the project (Claude Code docs). - Bash operations are unverified. Claude Code bash komutlarını doğrudan çalıştırır.
git commit -m "fix"kullanışlıdır, ancak çalışma dizininde bir.envdosyası varsa ve bir glob bunu içeriyorsa, işleme alınır. Claude Code onaylamadan önce daimagit diff --cached'yi inceleyin.
Sonraki adımlar
Bu öğelerin neden önemli olduğuna dair eğitim ortamı ister misiniz? AI-generated code security scanning'yi okuyun. Her sağlamlaştırma adımı için somut kod parçacıkları mı istiyorsunuz? Bkz. How to secure an app built with AI coding tools.
