← Yazılar
Güvenlik · Vibe Coding

Vibe coding'de güvenlik: yayına almadan önce 19 kontrol.

Yapay zekâ çalışan kodu dakikalar içinde yazıyor; güvenli kodu yazmıyor. Araştırmalar ve 2025'in gerçek olaylarıyla, bir uygulamayı yayına almadan önce kontrol etmen gereken 19 adım.

Şubat 2025'te Andrej Karpathy "vibe coding" diye bir şeyden bahsetti: koda bakmadan, yapay zekâya ne istediğini anlatıp çıkan sonucu kabul ederek yazılım üretmek. Bir yıl içinde bu, hafta sonu projelerinin değil, gerçek kullanıcısı olan ürünlerin geliştirme biçimine dönüştü.

Sorun şu: yapay zekâ çalışan kodu çok iyi yazıyor. Giriş ekranı açılıyor, form kaydediyor, ödeme sayfası yükleniyor. Ama "çalışıyor" ile "güvenli" arasındaki mesafe, demo ile canlı ürün arasındaki mesafe kadar büyük. Ve bu mesafeyi kimse prompt'a yazmadığı için model de kapatmıyor.

Bu yazıda, bir uygulamayı yayına almadan önce kontrol ettiğim 19 adımı altı katmanda topladım. Her birinde yapay zekânın tipik olarak ne yaptığını, senin ne yapman gerektiğini ve prompt'una ekleyebileceğin cümleyi bulacaksın. Önce rakamlara bakalım.

RakamlarlaYapay zekânın yazdığı kod ne kadar güvenli?
%45Kodlama görevlerinde güvenlik açığı içeren çıktı oranıVeracode · 100+ model
%86XSS'e karşı güvenli kod üretilemeyen vaka oranıVeracode · CWE-80
%19,7Önerilen paketlerden gerçekte var olmayanların oranıUSENIX Security 2025
%6,4Copilot kullanan açık depolarda sızan secret oranı (genel ortalama %4,6)GitGuardian 2025
2.000+5.600 vibe-coded uygulamada bulunan zafiyet; 400+ açıkta secretEscape.tech
4,44 mn $Bir veri ihlalinin küresel ortalama maliyetiIBM 2025
Kaynaklar yazının sonunda. Veracode oranı, 80 görev × 100'ü aşkın büyük dil modeli üzerinden hesaplanmıştır.

Neden "çalışıyor" yetmez?

Bir dil modeli, kendisinden isteneni üretmek üzere eğitilir. "Kullanıcı giriş yapabilsin" dediğinde giriş yapılabilen bir ekran alırsın. "Giriş denemeleri sınırlansın, şifreler Argon2 ile saklansın, hatalı girişte kullanıcı adının var olup olmadığı belli olmasın" demediğin sürece bunlar büyük olasılıkla gelmez. Güvenlik, kimsenin istemediği ama herkesin varsaydığı bir gereksinimdir.

Veracode'un 2025 raporu bunun ölçülebilir olduğunu gösterdi: güvenli ve güvensiz iki yol arasında seçim yapabildiği durumlarda modeller vakaların %45'inde güvensiz olanı seçti. Daha çarpıcı olanı, modeller sözdizimi açısından her yıl daha iyi kod yazarken güvenlik başarısının yerinde saymasıydı.

İşin insan tarafı da var. Stanford'dan bir ekip, katılımcılara aynı güvenlik görevlerini yapay zekâ asistanıyla ve asistansız çözdürdü:

Stanford · ACM CCS 2023Asistan kullananlar daha az güvenli kod yazdı ve kodlarını daha güvenli sandı
Yapay zekâ asistanıyla
  • Belirgin biçimde daha az güvenli kod
  • Kodunun güvenli olduğuna inanma eğilimi daha yüksek
  • Asistana az güvenip prompt'unu düzeltenlerde daha az açık
Asistansız
  • Daha güvenli çözümler
  • Kendi kodu hakkında daha temkinli
  • Aynı beş görev; Python, JavaScript ve C
Perry, Srivastava, Kumar, Boneh · "Do Users Write More Insecure Code with AI Assistants?" · CCS '23

En tehlikelisi ikinci madde: aşırı güven. Kod hızlı geldiği için doğru da geldiğini varsayıyoruz. 2025 yılı, bu varsayımın bedelini birkaç kez açıkça gösterdi.

2025Bir yılda yaşananlar
  1. MartEnrichLead kapandı

    Kurucusu "tek satır elle kod yazmadan" geliştirdiğini duyurduğu SaaS ürünü, kısa süre içinde saldırıya uğradı: API anahtarları ön yüzdeydi, abonelik kontrolü atlatıldı, anahtarların kotası tüketildi. Ürün kapatıldı.

    Secret yönetimi · Yetkilendirme · Rate limiting
  2. MayısCVE-2025-48757 · Lovable

    Üretilen uygulamalarda eksik Row-Level Security politikaları, kimliği doğrulanmamış kişilerin tabloları okuyup yazabilmesine yol açtı. Bir araştırmacının taradığı 1.645 uygulamanın yaklaşık 170'inde veriler açıktaydı.

    IDOR · Veritabanı güvenliği
  3. TemmuzReplit ajanı canlı veritabanını sildi

    "Onay almadan değişiklik yapma" talimatına rağmen ajan, 1.206 yönetici ve 1.196'dan fazla şirket kaydını içeren veritabanını sildi, ardından geri dönüşün imkânsız olduğunu söyledi. Veri, yedekten geri getirildi.

    Veritabanı güvenliği · Yedekleme
  4. TemmuzTea uygulaması

    Herkese açık bırakılmış bir Firebase depolama alanından yaklaşık 72.000 görsel sızdı; bunların yaklaşık 13.000'i doğrulama selfie'si ve kimlik fotoğrafıydı. Ardından 1,1 milyon özel mesaj içeren ikinci bir veri seti ortaya çıktı.

    Dosya yükleme · Yetkilendirme
  5. 2025 · AraştırmaEscape.tech: 5.600 uygulama

    Vibe coding platformlarıyla yapılmış, herkese açık 5.600'den fazla uygulamayı pasif olarak taradılar: 2.000'den fazla zafiyet, 400'den fazla açıkta secret ve 175 kişisel veri ifşası (sağlık kayıtları, IBAN, telefon).

    Hepsi
NVD · OECD AI Incidents · BleepingComputer · Escape.tech

Bu olayların hiçbiri sıfırıncı gün açığı ya da devlet destekli bir saldırı değildi. Hepsi, aşağıdaki listede adı geçen temel kontrollerden birinin ya da birkaçının eksikliğiydi.

19 kontrol, 6 katman

Listeyi tek tek ezberlemek yerine katmanlar halinde düşünmek işe yarıyor. Bir katman atlatılsa bile arkasında bir başkası durmalı.

HaritaSavunma katmanları
01Kimlik ve erişimKim, neye erişebilir?AuthenticationAuthorizationIDOR / sahiplik
02Girdi ve çıktıGelen veriye güvenmeInput validationSQL injectionXSSDosya yükleme
03Tarayıcı ve taşımaYolda ve istemcideHTTPSSecure cookiesCORSSecurity headers
04Uygulama davranışıYük, hata, izRate limitingGlobal exception handlingLogging / audit
05Veri ve sırlarEn değerli varlıklarSecret managementVeritabanı güvenliğiYedekleme
06Tedarik zinciriBaşkasının koduDependency scanningCI/CD güvenlik taraması

Bu liste rastgele değil. OWASP'ın Kasım 2025'te yayımlanan ve 2,8 milyondan fazla uygulamanın verisine dayanan Top 10 listesinin her maddesi, bu 19 kontrolden en az biriyle karşılanıyor:

OWASP Top 10 · 2025Hangi risk, hangi kontrolle kapanır?
A01Broken Access ControlAuthorization · IDOR · CORS
A02Security MisconfigurationSecurity headers · Cookies · DB ayarları
A03Software Supply Chain FailuresDependency scanning · CI/CD
A04Cryptographic FailuresHTTPS · Secret management · Şifre hash
A05InjectionInput validation · SQLi · XSS
A06Insecure DesignRate limiting · Sahiplik · Dosya yükleme
A07Authentication FailuresAuthentication · Rate limiting · Cookies
A08Software or Data Integrity FailuresCI/CD · Yedekleme · Dosya yükleme
A09Security Logging & Alerting FailuresLogging / audit
A10Mishandling of Exceptional ConditionsGlobal exception handling
OWASP Top 10:2025. A03 ve A10 bu sürümde ilk kez ayrı kategori oldu.

Katman 1 · Kimlik ve erişim

01 Authentication: kimlik doğrulama

Kimlik doğrulama, "sen kimsin?" sorusunun cevabı. Verizon'un 2025 raporunda ihlallerin en sık başlangıç noktası hâlâ çalınmış ya da kötüye kullanılmış kimlik bilgileri (%22). Yani kapı genelde kırılmıyor; anahtarla açılıyor.

Yapay zekâ genelde

Giriş sistemini sıfırdan yazar. Şifreyi düz metin, MD5 ya da tuzsuz SHA-256 ile saklar. JWT'yi "secret" gibi bir anahtarla ve süresiz imzalar. "Bu e-posta kayıtlı değil" diyerek hesap varlığını ele verir.

Senin yapman gereken

Framework'ün yerleşik auth sistemini ya da olgun bir sağlayıcıyı kullan. Şifreleri Argon2id veya bcrypt ile sakla. Yönetici hesaplarında iki aşamalı doğrulamayı zorunlu kıl. Oturumlara süre koy, hata mesajlarını genel tut.

Kimlik doğrulamayı sıfırdan yazma; framework'ün yerleşik auth sistemini kullan. Şifreleri Argon2id ile hashle, yönetici hesapları için 2FA ekle, oturum ve token'lara süre sınırı koy. Hatalı girişte yalnızca "e-posta veya şifre hatalı" yaz.

02 Authorization: yetkilendirme

Kimlik doğrulama kim olduğunu söyler; yetkilendirme ne yapabileceğini. OWASP listesinde "Broken Access Control" 2021'de de birinciydi, 2025'te de birinci. Vibe-coded uygulamalardaki en yaygın hata, yetki kontrolünün yalnızca arayüzde yapılması: yönetici butonu normal kullanıcıya gösterilmiyor ama endpoint herkese açık. EnrichLead'de ücretli özelliklerin atlatılması tam olarak buydu.

Kural basit: her istek, sunucuda, varsayılan olarak reddedilir; açıkça izin verilen kontrol edilir.

# Kötü: kontrol yalnızca ön yüzde
@api_view(["DELETE"])
def delete_course(request, pk):
    Course.objects.filter(pk=pk).delete()

# İyi: sunucuda, her istekte
@api_view(["DELETE"])
@permission_classes([IsAuthenticated, IsCourseAdmin])
def delete_course(request, pk):
    course = get_object_or_404(Course, pk=pk, organization=request.user.organization)
    course.delete()

IBM'in 2025 raporu bunun yapay zekâ sistemlerinin kendisi için de geçerli olduğunu gösteriyor: yapay zekâ modeli ya da uygulaması ihlali yaşayan kurumların %97'sinde yapay zekâya özgü erişim kontrolleri yoktu.

Her endpoint için kimin erişebileceğini açıkça yaz ve kontrolü sunucuda yap. Varsayılan davranış reddetmek olsun. Yalnızca arayüzde buton gizlemek yetkilendirme değildir.

03 IDOR ve sahiplik kontrolü

/api/faturalar/1043 adresini açabiliyorsan 1044'ü de deneyebilirsin. Sunucu "bu fatura bu kullanıcının mı?" diye sormuyorsa, başkasının faturasını görürsün. Buna IDOR (Insecure Direct Object Reference) deniyor ve otomatik tarayıcıların en zor yakaladığı, saldırganların ise en kolay bulduğu açıklardan biri.

# Kötü: herhangi bir faturayı döndürür
invoice = Invoice.objects.get(pk=pk)

# İyi: sorgu sahibiyle sınırlı; başkasınınki için 404
invoice = get_object_or_404(Invoice, pk=pk, owner=request.user)

UUID kullanmak tahmini zorlaştırır ama sahiplik kontrolünün yerini tutmaz. Ön yüz doğrudan veritabanıyla konuşuyorsa (Supabase, Firebase) bu kontrol veritabanı seviyesinde, Row-Level Security ile yapılmalı. Lovable vakası, bu politikanın eksik olduğu durumu gösteriyor.

Bir kaynağı ID ile getiren her sorguyu oturumdaki kullanıcıyla sınırla (owner=request.user). Başkasına ait kayıt için 403 değil 404 döndür. Supabase kullanıyorsan her tabloda RLS'yi aç ve politikaları yaz.

Katman 2 · Girdi ve çıktı

04 Input validation: girdi doğrulama

Tarayıcıdaki doğrulama kullanıcı deneyimi içindir, güvenlik için değil. Saldırgan formunu kullanmaz; isteği doğrudan atar. Her girdi sunucuda tip, uzunluk, biçim ve aralık açısından doğrulanmalı. Mümkünse izin listesiyle: "neyi yasaklayayım?" değil, "neyi kabul edeyim?"

Sık atlanan bir tür de mass assignment: modelin tüm alanlarını kabul eden bir serializer, kullanıcının isteğe "is_admin": true eklemesine kapı açar.

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = ["display_name", "bio", "avatar"]   # açıkça say
        read_only_fields = ["role", "is_verified"]
Tüm girdileri sunucuda bir şema ile doğrula (DRF serializer, Pydantic ya da Zod). Kabul edilen alanları açıkça listele, "__all__" kullanma. Uzunluk ve aralık sınırları koy.

05 SQL injection koruması

ORM kullanıyorsan büyük ölçüde korunursun. Yapay zekâ ise tam ORM'in yetmediği yerlerde, yani dinamik filtreler, arama ve sıralama gibi durumlarda, ham SQL'e geçip değeri metnin içine gömmeye meyillidir.

# Kötü: kullanıcı girdisi sorgunun parçası olur
cursor.execute(f"SELECT * FROM products WHERE name LIKE '%{q}%'")

# İyi: parametreli sorgu
cursor.execute("SELECT * FROM products WHERE name LIKE %s", [f"%{q}%"])

# Sıralama sütunu parametre olamaz: izin listesi kullan
order = {"fiyat": "price", "tarih": "created_at"}.get(sort, "created_at")
Ham SQL yazman gerekiyorsa yalnızca parametreli sorgu kullan; f-string ya da string birleştirme kullanma. ORDER BY ve tablo adları için izin listesi kullan.

06 XSS koruması

Veracode'un testlerinde modeller XSS'e karşı güvenli kod üretmekte en çok zorlandı: vakaların %86'sında başarısız oldular.

Veracode 2025Modellerin güvenli kod üretemediği vaka oranı
Log injectionCWE-117%88
Cross-site scriptingCWE-80%86
Java'da tüm görevler%70+
Tüm görevler100+ model ortalaması%45
Veracode 2025 GenAI Code Security Report. Python, C# ve JavaScript'te oran %38 ile %45 arasında.

Modern şablon motorları (Django, Jinja, React) çıktıyı varsayılan olarak kaçışlar. Açık, bu korumayı bilerek kapattığın yerlerde doğar: Django'da |safe ve mark_safe, React'te dangerouslySetInnerHTML, Vue'da v-html, düz JavaScript'te innerHTML. Zengin metin göstermek zorundaysan HTML'i bir izin listesiyle temizle (Python'da nh3, tarayıcıda DOMPurify) ve arkasına bir Content Security Policy koy.

Bu blog da böyle çalışıyor: yazdığım Markdown, sayfaya basılmadan önce nh3 ile temizleniyor. Yönetici hesabım ele geçirilse bile bir yazının içine <script> gömülemiyor.

Kullanıcıdan gelen hiçbir içeriği kaçışlamadan HTML'e basma. innerHTML, dangerouslySetInnerHTML, v-html ve |safe kullanma; gerekiyorsa önce DOMPurify ya da nh3 ile temizle.

07 Dosya yükleme doğrulaması

"Profil fotoğrafı yükle" özelliği, sunucuna dosya yazma yetkisi vermek demek. Uzantıya bakmak yetmez; foto.jpg.php ya da içinde script olan bir SVG, uzantı kontrolünden geçer.

  • Dosyanın içeriğini doğrula (sihirli baytlar ya da görseli gerçekten açmayı deneyerek).
  • Boyut sınırı koy; dosya adını rastgele üret, kullanıcının verdiği adı kullanma.
  • Dosyaları web kökünün dışında ya da ayrı bir depolama alanında tut; asla çalıştırma.
  • Depolama alanının erişim kurallarını kontrol et. Tea vakasında sızıntı, kimsenin bakmadığı açık bir depolama alanından geldi.
Dosya yüklemede uzantıya değil içeriğe bak, en fazla 5 MB kabul et, dosya adını UUID ile yeniden oluştur. Depolama alanı varsayılan olarak özel olsun; dosyalara süreli, imzalı URL ile eriş.

Katman 3 · Tarayıcı ve taşıma

08 HTTPS

Bugün HTTPS bir tercih değil, varsayılan. Let's Encrypt ücretsiz; Vercel, Render, Railway gibi platformlar sertifikayı kendiliğinden kuruyor. Kontrol etmen gerekenler şunlar: HTTP isteklerinin HTTPS'e yönlendirilmesi, HSTS başlığıyla tarayıcının bir daha HTTP denememesi ve uygulama bir proxy arkasındaysa isteğin gerçekten HTTPS ile geldiğini bilmesi.

SECURE_SSL_REDIRECT = True
SECURE_HSTS_SECONDS = 31536000
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")

09 Secure cookies

Oturum çerezi, hesabın anahtarıdır. Üç bayrak bu anahtarı korur:

Bayrak Ne yapar?
HttpOnly JavaScript çereze erişemez; bir XSS açığı oturumu çalamaz.
Secure Çerez yalnızca HTTPS üzerinden gönderilir.
SameSite=Lax Başka sitelerden gelen isteklerde çerez gönderilmez; CSRF riskini azaltır.

Yapay zekâ token'ı sık sık localStorage'a yazar. Orası sayfadaki her script'in erişebildiği bir alan; tek bir XSS açığı oturumu da götürür. Oturumu HttpOnly bir çerezde tutmak daha güvenli bir varsayılan. Girişten sonra oturum kimliğini yenilemeyi de unutma.

Oturumu HttpOnly, Secure ve SameSite=Lax bir çerezde tut. Token'ı localStorage'a yazma. Girişte oturum kimliğini yenile ve oturuma süre sınırı koy.

10 CORS yapılandırması

CORS, saldırganı durduran bir duvar değil. Tarayıcının "farklı kökenden okumaya" koyduğu kısıtı gevşetmenin kuralları. Yapay zekâ bir CORS hatası gördüğünde en hızlı çözümü önerir: allow_origins=[""]. Çerezlerle birlikte çalışmadığı için bir sonraki adımda gelen Origin başlığını olduğu gibi geri yansıtır. Bu, her sitenin kullanıcın adına API'ne istek atıp cevabı okuyabilmesi demek.

Yapay zekâ genelde

Access-Control-Allow-Origin: * ya da gelen Origin'i yansıtmak, üstüne Allow-Credentials: true.

Senin yapman gereken

Açık bir izin listesi: https://uygulamam.com, https://admin.uygulamam.com. Geliştirme kökenleri yalnızca geliştirme ortamında.

11 Security headers: güvenlik başlıkları

Birkaç HTTP başlığı, tarayıcıya "bu sayfada neye izin var?" sorusunun cevabını verir. Kurması on dakika sürer, bir sürü saldırı sınıfını baştan kapatır.

Başlık Neyi önler?
Content-Security-Policy İzin verilmeyen kaynaktan script yüklenmesini; XSS'in etkisini sınırlar.
Strict-Transport-Security HTTPS'ten HTTP'ye düşürme saldırılarını.
X-Content-Type-Options: nosniff Tarayıcının dosya türünü tahmin edip script çalıştırmasını.
frame-ancestors / X-Frame-Options Sayfanın başka sitede görünmez çerçeveye alınmasını (clickjacking).
Referrer-Policy URL'deki bilgilerin başka sitelere sızmasını.
Permissions-Policy Kamera, mikrofon, konum gibi API'lerin gereksiz kullanımını.

Sonucu securityheaders.com ya da Mozilla Observatory ile kontrol edebilirsin.

Katman 4 · Uygulama davranışı

12 Rate limiting: istek sınırlama

Sınırı olmayan bir giriş formu, saniyede binlerce şifre denenebilecek bir kapıdır. Sınırı olmayan bir yapay zekâ endpoint'i ise başkasının senin faturanla çalıştırdığı bir modeldir. EnrichLead'de API anahtarlarının kotası bu yüzden tükendi.

Sınır koyman gereken yerler: giriş, şifre sıfırlama, OTP doğrulama, kayıt, e-posta ve SMS gönderen her şey ve pahalı işlemler (LLM çağrıları, dosya dönüştürme, dışa aktarma). Bu sitede yönetici girişine IP başına 15 dakikada 5 hatalı deneme, PDF üretimine dakikada 10 istek sınırı var.

Giriş, şifre sıfırlama, OTP ve LLM çağrısı yapan endpoint'lere IP ve kullanıcı bazlı rate limit ekle; aşıldığında 429 döndür. Harici API'ler için sağlayıcı panelinde aylık harcama limiti tanımla.

13 Global exception handling: hata yönetimi

OWASP 2025'te ilk kez ayrı bir kategori açtı: Mishandling of Exceptional Conditions. İki riski var. Birincisi, hatanın kullanıcıya fazla şey anlatması: yığın izi, SQL sorgusu, dosya yolları, kütüphane sürümleri. İkincisi daha sinsi: hata anında sistemin açık kalması (fail open). Yetki kontrolü bir istisna fırlattığında isteğin geçmesine izin veren bir kod, kontrolsüz koddan daha tehlikelidir.

AkışBir hata olduğunda kim ne görmeli?
1 · Hataİstisna yakalanırTek bir merkezi işleyici; her yerde try/except değil
2 · KararKapalı başarısız olŞüphede reddet; yetki kontrolü hata verirse istek geçmez
3 · KullanıcıGenel mesaj"Bir şeyler ters gitti" ve bir takip kodu
4 · SunucuTam kayıtYığın izi, istek kimliği, kullanıcı; alarm
Canlıda DEBUG kapalı olsun. Tek bir global hata işleyici yaz: kullanıcıya genel mesaj ve takip kodu dön, ayrıntıyı sunucu loguna yaz. Yetki veya doğrulama sırasında hata olursa isteği reddet.

14 Logging ve audit log

İhlal fark edilmeden geçen her gün, saldırgana kazandırılmış bir gündür. Log, "ne oldu?" sorusunun tek cevabı. Ama yanlış log da risk: Veracode'un testlerinde modeller log injection'a karşı vakaların %88'inde güvensiz kod üretti; kullanıcı girdisini temizlemeden log'a yazmak, sahte log satırları üretmenin yolunu açar.

  • Kaydet: başarılı ve başarısız girişler, yetki reddi, yönetici işlemleri, veri dışa aktarma, ayar değişiklikleri. Her kayıtta kim, ne, ne zaman, nereden ve sonuç.
  • Kaydetme: şifreler, token'lar, tam kart numaraları, gereğinden fazla kişisel veri.
  • Logları uygulama sunucusundan ayrı bir yerde tut ve kritik olaylara alarm kur.

Bu sitede her giriş denemesi ayrı bir güvenlik log'una düşüyor; ziyaretçi sayacı ise IP adresini hiç saklamıyor, yalnızca tuzlanmış bir özetini tutuyor.

Katman 5 · Veri ve sırlar

15 Secret management: gizli anahtar yönetimi

API anahtarı, veritabanı şifresi, ödeme sağlayıcısı anahtarı. Bunların koda girmesi, vibe coding'in en sık ve en pahalı hatası.

GitGuardianAçık GitHub depolarında sızan secret sayısı
202423,8 mn
2025+%34, ölçülen en büyük artış~29 mn
+%81Yapay zekâ servislerine ait sızan secret'larda artış (2025)
%6,4Copilot kullanan depolarda sızıntı oranı; genel ortalama %4,6
%702022'de sızan secret'lardan iki yıl sonra hâlâ geçerli olanlar
GitGuardian State of Secrets Sprawl 2025 ve 2026

Vibe coding'e özgü bir tuzak daha var: ön yüz framework'lerinde NEXT_PUBLIC_ ya da VITE_ önekiyle başlayan her değişken tarayıcıya giden pakete gömülür. Yapay zekâ bir değişkeni "çalışsın" diye bu önekle tanımladığında, gizli anahtarın herkesin görebileceği bir JavaScript dosyasına girer.

  • Secret'lar .env'de, .env ise .gitignore'da. Canlıda platformun secret yöneticisi.
  • Gizli anahtar gerektiren her çağrı sunucudan yapılır; tarayıcı yalnızca senin backend'inle konuşur.
  • Commit öncesi tarama (gitleaks, ggshield) kur.
  • Bir secret sızdıysa commit'i silmek yetmez: anahtarı hemen iptal et ve yenisini üret.
Hiçbir API anahtarını koda ya da NEXT_PUBLIC_/VITE_ önekli değişkene yazma. Gizli anahtar gerektiren tüm çağrıları sunucu tarafında yap ve anahtarları ortam değişkenlerinden oku. Bir .env.example dosyası oluştur.

16 Veritabanı güvenliği

Uygulamanın veritabanı kullanıcısı tablo silebiliyor mu? Veritabanı internete açık mı? Geliştirme ile canlı aynı veritabanı mı? Replit vakasında bu sorulardan sonuncusunun cevabı "evet"ti. Sonrasında platform, geliştirme ve canlı veritabanlarını otomatik olarak ayırmaya başladı.

  • En az yetki: uygulama kullanıcısı yalnızca ihtiyaç duyduğu tablolarda okuma ve yazma yapabilsin; şema değişikliği ayrı bir kullanıcıyla.
  • Veritabanı yalnızca uygulamanın ağından erişilebilir olsun; bağlantılar TLS ile.
  • Ön yüz veritabanına doğrudan bağlanıyorsa RLS ya da güvenlik kuralları her tabloda açık olsun.
  • Yapay zekâ ajanlarına canlı veritabanı kimlik bilgisi verme. Ajan geliştirme ortamında çalışsın; canlıya giden her değişiklik insan onayından geçsin.

17 Yedekleme

Yedek, diğer 16 kontrolün başarısız olduğu gün devreye giren kontrol. Sophos'un 2024 araştırmasına göre fidye yazılımı saldırısından sonraki ortalama toparlanma maliyeti, fidye hariç 2,73 milyon dolar. Replit vakasının mutlu sonla bitmesinin tek nedeni de bir yedeğin var olmasıydı.

Kural3-2-1 yedekleme
3kopyaCanlı veri ve iki yedek
2farklı ortamÖrneğin yönetilen veritabanı yedeği ve nesne depolama
1ayrı yerdeFarklı hesap ya da bölgede; tercihen değiştirilemez
Test edilmemiş yedek, yedek değildir: geri yüklemeyi düzenli olarak dene.

İki sayıyı baştan belirle: ne kadar veri kaybını göze alabilirsin (RPO) ve ne kadar sürede ayağa kalkman gerekir (RTO). Yedekleme sıklığın ve yöntemin bu iki cevaptan çıkar.

Katman 6 · Tedarik zinciri ve süreç

18 Dependency scanning: bağımlılık taraması

Yazdığın kodun büyük kısmı aslında senin değil; kurduğun paketlerin. Sonatype, Kasım 2023'ten itibaren bir yıl içinde 512.847 kötü amaçlı açık kaynak paket tespit etti; bir önceki yıla göre %156 artış.

Yapay zekâ buna yeni bir risk ekledi: olmayan paketler. USENIX Security 2025'te yayımlanan bir çalışma, 16 modelin ürettiği 576.000 kod örneğini inceledi. Önerilen paketlerin yaklaşık beşte biri gerçekte yoktu. Üstelik aynı uydurma isimler tekrar tekrar önerildiği için saldırgan bu isimleri önceden kaydedip içine zararlı kod koyabiliyor. Buna slopsquatting deniyor.

USENIX Security 2025Önerilen paketlerden var olmayanların oranı
Açık kaynak modeller%21,7
Tüm modeller%19,7
Ticari modeller%5,2
205.474Benzersiz uydurma paket adı
30.000+Sık uydurulan "huggingface-cli" adıyla kaydedilen boş paketin 3 ayda indirilme sayısı
Spracklen ve diğerleri · "We Have a Package for You!" · 2024 başında erişilebilir modellerle yapılmıştır.
  • Yapay zekânın önerdiği her paketi kurmadan önce kayıt sayfasına bak: gerçekten var mı, kim yayınlıyor, kaç indirme almış, ne zamandan beri var?
  • Lock dosyasını (package-lock.json, poetry.lock) depoya ekle.
  • npm audit, pip-audit, OSV-Scanner ve Dependabot ya da Renovate ile bilinen açıkları sürekli tara.
Yeni bir paket önermeden önce resmî kayıtta var olduğundan ve aktif olarak bakımının yapıldığından emin ol. Aynı işi standart kütüphaneyle yapabiliyorsan paket ekleme.

19 CI/CD güvenlik taraması

Son kontrol, diğerlerinin bir kez yapılıp unutulmamasını sağlıyor. Her push'ta çalışan bir pipeline, insanın gözden kaçırdığını yakalar ve daha önemlisi, yeni gelen kodun eskiyi bozmasını engeller.

PipelineHer push'ta çalışan güvenlik adımları
1 · SecretSır taramasıgitleaks · ggshield
2 · SASTStatik analizSemgrep · CodeQL · Bandit
3 · SCABağımlılıklarpip-audit · npm audit · OSV
4 · DASTCanlıya benzer testOWASP ZAP · staging ortamında
KapıYüksek risk = durdurKritik bulgu varsa yayın yok
# .github/workflows/security.yml
name: security
on: [push, pull_request]
permissions:
  contents: read
jobs:
  scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: pip install pip-audit bandit
      - run: pip-audit -r requirements.txt
      - run: bandit -r . -x ./tests -ll

Pipeline'ın kendisi de bir saldırı yüzeyi: CI secret'larını en az yetkiyle tanımla, üçüncü parti action'ları bir sürüme ya da commit'e sabitle ve permissions alanını açıkça yaz.

Nereden başlamalı?

On dokuz madde göz korkutabilir. Hepsi aynı anda gerekmiyor; ama bir kısmı olmadan yayına çıkmak, kapıyı açık bırakıp tatile gitmek gibi.

Öncelik19 kontrolü sıraya koymak
Yayından önceŞart
  • Authentication
  • Authorization
  • IDOR / sahiplik
  • Input validation
  • SQL injection
  • XSS
  • HTTPS
  • Secret management
  • Veritabanı güvenliği
  • Yedekleme
İlk haftaSertleştir
  • Secure cookies
  • CORS
  • Security headers
  • Rate limiting
  • Global exception handling
  • Dosya yükleme
SürekliOtomatikleştir
  • Logging / audit
  • Dependency scanning
  • CI/CD taraması
Uygulaman dosya yüklemesi alıyorsa o maddeyi "Yayından önce" sütununa taşı.

Son bir öneri: yapay zekâya güvenliği yazdırmak yerine sor. Kod üretildikten sonra aynı modele, ayrı bir konuşmada, bu listeyi verip kendi kodunu denetlemesini iste. Üreten model ile denetleyen bakış açısı ayrıldığında, ilk turda kaçan şeylerin önemli bir kısmı yakalanıyor. Yine de son karar, kodu okuyan bir insanda kalmalı.

Aşağıdaki kodu bir güvenlik denetçisi gibi incele. Şu başlıkların her biri için "uygun / eksik / ilgisiz" yaz ve eksik olanlar için düzeltilmiş kodu ver: authentication, authorization, IDOR, input validation, SQL injection, XSS, dosya yükleme, HTTPS, cookies, CORS, security headers, rate limiting, hata yönetimi, logging, secret yönetimi, veritabanı yetkileri, yedekleme, bağımlılıklar, CI/CD.

Yapay zekâ, çok hızlı ve çok istekli bir yardımcı. Ama hızlı yazılan kod, okunmadan yayına giden koddur. Hız güvenliğin önüne geçmesin.

Kaynaklar

  1. Veracode, 2025 GenAI Code Security Report, Temmuz 2025.
  2. N. Perry, M. Srivastava, D. Kumar, D. Boneh, Do Users Write More Insecure Code with AI Assistants?, ACM CCS 2023.
  3. J. Spracklen ve diğerleri, We Have a Package for You! A Comprehensive Analysis of Package Hallucinations by Code Generating LLMs, USENIX Security 2025.
  4. GitGuardian, The State of Secrets Sprawl 2025.
  5. GitGuardian, The State of Secrets Sprawl 2026 (The Hacker News özeti), Mart 2026.
  6. OWASP, OWASP Top 10:2025.
  7. IBM, Cost of a Data Breach Report 2025, Temmuz 2025.
  8. Verizon, 2025 Data Breach Investigations Report.
  9. Sonatype, 10th Annual State of the Software Supply Chain Report, Ekim 2024.
  10. Sophos, The State of Ransomware 2024.
  11. NIST NVD, CVE-2025-48757.
  12. Escape.tech, How we discovered over 2k high-impact vulnerabilities in apps built with vibe coding platforms.
  13. OECD AI Incidents Monitor, Replit AI coding tool deletes live production database, Temmuz 2025.
  14. BleepingComputer, Tea app leak worsens with second database exposing user chats, Temmuz 2025.
  15. Indie Hackers, Vibe coding has a security problem, 2025.
Bu yazıyı kaydet