vibe coding api key güvenliği ai wrapper openai cloudflare ai gateway

Vibe Coded AI Wrapper'ınızın API Key'i Neden Bloklandı

Abdullah Bozdağ 20 Nisan 2026
Vibe Coded AI Wrapper'ınızın API Key'i Neden Bloklandı

Geçen ay bir müşterimizin Lovable ile iki haftada çıkardığı AI sohbet asistanı, deploy'dan altı saat sonra çalışmayı durdurdu. OpenAI key'i revoke edilmişti. Kodu açtık, sk-proj-... string'i doğrudan bundle.js içinde duruyordu. Bu artık izole bir hikaye değil, haftalık gördüğümüz bir pattern.

API keyinizi nasıl saatler içinde buluyorlar?

Vibe coding, Andrej Karpathy'nin 2025 başında popülerleştirdiği terim: LLM'e ne istediğinizi söylersiniz, agent kod yazar, siz deploy edersiniz. Hızı harika. Sorun şurada: agent, OpenAI API'sine istek at dediğinizde en hızlı çalışan kodu üretir, en güvenli olanı değil.

Cyble Research 5.000+ GitHub repo'sunda ve 3.000+ canlı production sitesinde hardcoded ChatGPT key'i tespit etti. RedHunt Labs, vibe-coded site taramalarında her beş siteden birinin en az bir secret sızdırdığını, toplamda 25.000 civarı unique key'in açıkta olduğunu raporladı. Wiz'in Forbes AI 50 listesi üzerinde yaptığı taramada şirketlerin %65'inde verified secret leak'i vardı. Rakamlar uyduruk değil, sektörün yayınladığı raporlar.

GitHub secret scanning ve provider'larla otomatik entegrasyon

Public repo'ya key commit ettiğinizde olan şey şu: GitHub her push'u, OpenAI, Anthropic, AWS, Stripe gibi partner'ların sağladığı regex pattern'lerine karşı tarar. Match olduğu anda key, token issuer'a iletilir. OpenAI help center net konuşuyor: public internette veya app store uygulamasında leak edilmiş bir key tespit edildiğinde, key hemen devre dışı bırakılıyor.

"End-to-end süreç birkaç saniye sürüyor" diyor GitHub'ın kendi changelog'u. Yani commit ettiğiniz andan key'in kapatılmasına kadar geçen süre, kahve alıp masaya dönmenizden kısa.

Kötü haber: "public repo'ya koymadım ki" bahanesi genellikle işe yaramıyor. Key'iniz frontend bundle'a gömülüyse, Inspect Element açan herkes görebilir. Deploy ettiğiniz her kullanıcı tarayıcısında sizin key'inizi taşır. Saldırgan botlar canlı sitelerin script'lerini de tarıyor, sadece GitHub'ı değil.

AI agent neden sürekli key'i frontend'e gömüyor?

Çünkü LLM'ler kodu çalıştırmak için optimize edildi, güvenli yapmak için değil. Columbia'dan yayınlanan bir araştırma, coding agent'ların speed-over-safety eğiliminde olduğunu ve permission denied hatasını çözmenin en hızlı yolunun genelde güvenlik katmanını kaldırmak olduğunu ortaya koyuyor. Veracode'un 2025 GenAI Code Security raporuna göre AI ile üretilen kodun yaklaşık %45'inde güvenlik açığı var.

Biz RadKod'da aynı pattern'i defalarca gördük: müşteri Cursor veya Lovable ile bir MVP yapmış, API çağrısı React bileşeninin içinden fetch ile atılıyor, key import.meta.env.VITE_OPENAI_KEY olarak inject edilmiş. VITE_ prefix'li environment variable frontend bundle'a gömülür, gizli değildir. Bu noktayı bilmeyen çok sayıda vibe coder ile çalıştık.

Doğru mimari: backend'de bir proxy katmanı

Tek kural var: provider API key'i sadece sunucu tarafında yaşasın. Frontend, sizin kendi endpoint'inize istek atsın, o endpoint provider'a forward'lasın.

Node.js ile minimal örnek (Express):

import express from 'express';\nimport OpenAI from 'openai';\nimport rateLimit from 'express-rate-limit';\n\nconst app = express();\napp.use(express.json());\n\nconst openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });\n\nconst limiter = rateLimit({\n windowMs: 60 * 1000,\n max: 20, // dakikada 20 istek\n});\n\napp.post('/api/chat', limiter, async (req, res) => {\n // Auth'u mutlaka burada yapın: session, JWT, Supabase auth vb.\n if (!req.user) return res.status(401).send('Unauthorized');\n\n const { messages } = req.body;\n\n const completion = await openai.chat.completions.create({\n model: 'gpt-4o-mini',\n messages,\n max_tokens: 500,\n });\n\n res.json(completion.choices[0].message);\n});\n\napp.listen(3000);

Bu kod üç iş yapar: key'i server env'ten okur, dakika başına request limiti koyar, auth'suz isteği reddeder. Production'da buna model whitelist'i, max_tokens hard cap'i ve kullanıcı başına günlük quota eklenir.

Cloudflare AI Gateway: hızlı bir kısa yol

Kendi proxy'nizi yazmak istemiyorsanız Cloudflare AI Gateway kullanılabilir bir seçenek. Provider key'inizi Cloudflare'de saklıyor (BYOK özelliği), siz Gateway endpoint'ine istek atıyorsunuz, Gateway provider'a forward'lıyor. Authenticated Gateway açıldığında cf-aig-authorization header'ı olmayan istekler düşüyor.

Peki hala frontend'den direkt Gateway'i çağırsak? Cevap: hayır. Gateway auth token'ını da frontend'e gömerseniz yine açıkta olursunuz. Gateway bir ara katman, auth katmanı değil. Kendi backend'iniz veya bir Cloudflare Worker ortada olmalı.

Trade-off şu: Gateway observability, caching, rate limiting ve multi-provider fallback gibi şeyleri bedava veriyor. Basit bir kişisel projede overkill olabilir; production ürünü için kurulum süresine değiyor.

Key'iniz sızdıysa tam olarak ne yapmalı?

  1. Revoke edin: OpenAI için platform.openai.com/api-keys, Anthropic için console.anthropic.com/settings/keys. Rotate etmek yetmez, eski key ölü olmalı.
  2. Git history'yi temizleyin: git rm ile commit'ten silmek history'yi temizlemez. git-filter-repo veya BFG Repo Cleaner ile history rewrite edin, sonra force-push.
  3. Billing dashboard'ını kontrol edin: Unauthorized usage varsa provider support'a ticket açın, abuse case'lerinde iade genellikle alınıyor.
  4. Spend alert kurun: OpenAI ve Anthropic dashboard'larında aylık limit ve %80, %95 threshold uyarıları var, açın.
  5. Pre-commit hook ekleyin: TruffleHog veya GitGuardian push'tan önce secret'ları yakalar. Vibe coding workflow'una dakikalar içinde entegre olur.

Hız ve güvenlik arasında pragmatik bir çizgi

Vibe coding'i reddetmek gerekmiyor. Haftada bir MVP çıkarmak gerçek bir avantaj. Ama API key'leri, database RLS policy'leri ve CORS ayarları gibi üç-dört kritik nokta var ki agent'ın üretimini gözden geçirmeden deploy ederseniz, kendinize bedava fatura kesiyorsunuz.

Bir sonraki adım: elinizdeki projenin frontend bundle'ını açın, grep "sk-" ve grep -iE "apikey|api_key" ile hızlı bir tarama yapın. Bir şey bulursanız yukarıdaki revoke adımlarıyla başlayın. Müşteri projelerinde bu pattern'i sık gördüğümüz için, client-side'dan LLM çağıran her projeyi önce bir proxy katmanı ekleyerek devraldık; kendi kodunuzda da aynı sıra işe yarıyor.

Paylaş:

RadKod Hizmetleri

Projeniz için profesyonel yazılım hizmetleri mi arıyorsunuz?

Web Geliştirme Mobil Uygulama Tum Hizmetler

Abdullah Bozdağ

Abdullah Bozdağ

RadKod Ekibi