Bir işletme sahibi olarak "Web sitesi istiyorum", "Bana bir admin panel yap" veya "Mobil uygulamaya ihtiyacım var" dediğinizde, artık birçok kişi doğrudan yapay zekânın kapısını çalıyor.
Birkaç komut yazılıyor ve dakikalar içinde ortaya çalışan bir şey çıkıyor:
- Giriş ekranı hazır
- Kayıtlar listeleniyor
- Ekleme ve silme butonları çalışıyor
- Admin panel açılıyor
İlk bakışta her şey tamam gibi görünüyor.
Ancak yazılım, bir mağazanın vitrinini düzenlemek gibi değildir. Vitrini beğenmezseniz bir hafta sonra değiştirirsiniz. Yazılımın arka planında yapılan bir hata ise aylarca, hatta yıllarca fark edilmeden kalabilir.
Üstelik sistem canlıya alındığında bu hatanın üzerine gerçek müşteri bilgileri, şifreler, ödemeler ve işletmenizin günlük süreçleri eklenir.
Son dönemde buna vibe coding deniyor: Kodun ne yaptığını tam olarak anlamadan, "Çalışıyor gibi görünüyor" diyerek yapay zekâya komut verip ilerlemek.
Yapay zekâ kullanmak yanlış değildir. Tam tersine, doğru kullanıldığında yazılım geliştirme sürecini ciddi şekilde hızlandırır.
Yanlış olan, yazılım mühendisliğini tamamen yapay zekâya bırakıp "Çalışıyorsa yeter" demektir.
AI bir araçtır, mühendis değildir
Yapay zekâ çok hızlı kod üretebilir. Ancak ürettiği kodun güvenli, sürdürülebilir ve işletmenizin ihtiyaçlarına uygun olduğunu garanti etmez.
AI'ın görevi size bir cevap üretmek ve işinizi kolaylaştırmaktır. Üretilen kodun doğru, güvenli ve kullanılabilir olup olmadığını kontrol etmek ise geliştiricinin sorumluluğundadır.
İşte yazılım bilgisi tam olarak burada devreye girer.
Deneyimli bir geliştirici yalnızca "Buton çalışıyor mu?" diye bakmaz. Şu soruları da sorar:
- Bu veriler nerede saklanıyor?
- Bu verilere kimler erişebilir?
- Kullanıcı şifreleri nasıl korunuyor?
- Biri sisteme kötü niyetli istekler gönderirse ne olur?
- Normal kullanıcı ile yönetici aynı işlemleri yapabilir mi?
- Projeye altı ay sonra yeni bir özellik eklemek kolay olacak mı?
- Sistem aynı anda kaç kullanıcıyı kaldırabilir?
- Bir hata oluştuğunda bunu nasıl fark edeceğiz?
- Veriler düzenli olarak yedekleniyor mu?
- Kullanılan paketlerde bilinen bir güvenlik açığı var mı?
Yapay zekâ bu soruların tamamını kendiliğinden sormayabilir.
Siz de sormazsanız, çalışan ama güvenli olmayan bir yazılım ortaya çıkabilir.
AI ile geliştirilen projelerde sık görülen hatalar
Deneyimli geliştiriciler, yapay zekâ ile hızlı şekilde hazırlanan projelerde benzer hatalarla sık sık karşılaşır.
Bunlar yapay zekânın kötü niyetli olmasından kaynaklanmaz. AI genellikle en hızlı şekilde çalışan bir sonuç üretmeye odaklanır.
Ancak bir kodun çalışması, onun güvenli ve doğru olduğu anlamına gelmez.
1. Hassas verileri koda gömmek
En sık karşılaşılan hatalardan biri; şifrelerin, API anahtarlarının, erişim token'larının ve yönetici bilgilerinin doğrudan kaynak kodun içine yazılmasıdır.
Örneğin:
- admin / admin123 gibi kolay tahmin edilen yönetici bilgileri kullanmak
- JWT_SECRET tanımlı değilse "secret-key" gibi sabit bir değer kullanmak
- Gerçek e-posta adreslerini ve şifreleri db.ts veya db.php dosyalarında düz metin olarak tutmak
- Stripe API anahtarını config.js dosyasına yazmak
- SMTP şifresini mail.php içinde düz metin olarak saklamak
- AWS erişim anahtarlarını kaynak koda eklemek
- .env dosyasını yanlışlıkla GitHub'a yüklemek
- Veritabanı bağlantı bilgilerini frontend koduna yazmak
- Test hesabı için test / test123 gibi kolay tahmin edilen bilgiler kullanmak
- Discord, GitHub veya Slack token'larını kaynak koda gömmek
- Private key dosyalarını proje klasöründe veya repoda bırakmak
Buradaki sorun basittir: Kaynak kodu gören biri, bu gizli bilgilere de ulaşabilir.
Özellikle frontend koduna yazılan bilgiler hiçbir zaman gizli değildir. Çünkü frontend kodu kullanıcının tarayıcısına gönderilir ve isteyen herkes tarafından incelenebilir.
Şifreler ve API anahtarları kaynak kodun içinde değil, ortam değişkenlerinde veya bu iş için hazırlanmış güvenli secret yönetim sistemlerinde tutulmalıdır.
Bir şifre ya da API anahtarı yanlışlıkla GitHub'a yüklendiyse yalnızca dosyadan silmek de yeterli değildir. Çünkü bu bilgi eski sürümlerde görünmeye devam edebilir.
Bu durumda ilgili anahtar iptal edilmeli ve yenisi oluşturulmalıdır. Buna secret rotation, yani gizli erişim bilgisinin yenilenmesi denir.
2. "Çalışıyor" ile "güvenli"yi karıştırmak
Yapay zekânın hazırladığı giriş sistemi bilgisayarda test edilir:
- Kullanıcı adı yazılır
- Şifre girilir
- Admin panel açılır
Bunun üzerine sistemin tamamlandığı düşünülür.
Oysa güvenlik yalnızca doğru şifreyle giriş yapıldığında ne olduğuyla ölçülmez. Yanlış, sahte veya kötü niyetli bir istek gönderildiğinde sistemin nasıl davrandığı da önemlidir.
Eksik bırakılabilecek bazı kontroller şunlardır:
- Rate limit: Aynı kişinin kısa sürede yüzlerce veya binlerce giriş denemesi yapmasını engeller.
- CSRF koruması: Kullanıcının haberi olmadan onun adına işlem yapılmasını önlemeye yardımcı olur.
- Oturum süresi: Kullanıcının girişinin ne kadar süre geçerli kalacağını belirler.
- Token yenileme: Süresi dolan oturumların güvenli şekilde yenilenmesini sağlar.
- Rol bazlı yetkilendirme: Personel, yönetici ve müşteri gibi farklı kullanıcıların yetkilerini ayırır.
- Girdi doğrulama: Formdan gelen verinin gerçekten beklenen formatta olup olmadığını kontrol eder.
- IDOR kontrolü: Bir kullanıcının başka bir kullanıcıya ait kayıtları görmesini veya değiştirmesini engeller.
- Brute force koruması: Şifrelerin otomatik olarak tekrar tekrar denenmesini zorlaştırır.
- Dosya yükleme kontrolü: Kullanıcının zararlı veya izin verilmeyen dosyalar yüklemesini engeller.
IDOR nedir?
Basit bir örnek üzerinden anlatalım.
Bir müşteri kendi faturasını şu adres üzerinden görüntülüyor olsun:
siteadi.com/fatura.php?id=50
Kullanıcı adresteki 50 değerini 51 yaptığında başka bir müşterinin faturasını görebiliyorsa sistemde ciddi bir yetkilendirme açığı vardır.
Sistem yalnızca şu kontrolü yapmıştır:
WHERE id = 50
Ancak şu kontrolü yapmamıştır:
WHERE id = 50
AND kullanici_id = oturumdaki_kullanici
Yani sistem faturayı bulmuştur ancak o faturayı isteyen kişinin gerçekten faturanın sahibi olup olmadığını kontrol etmemiştir.
Bu hata tek bir kullanıcı hesabıyla test yapıldığında fark edilmeyebilir. Gerçek kullanıcılar sisteme girdiğinde ise müşteri verilerinin açığa çıkmasına neden olabilir.
3. Hata mesajlarında gereğinden fazla bilgi göstermek
Yazılım geliştirilirken ayrıntılı hata mesajları faydalıdır. Çünkü geliştirici sorunun hangi dosyada, hangi satırda ve hangi sorguda olduğunu daha hızlı bulabilir.
Ancak bu bilgiler gerçek kullanıcılara gösterilmemelidir.
Kullanıcı sistemde bir hata oluştuğunda şuna benzer bir mesaj görmemelidir:
SQLSTATE[42S02]: Base table or view not found:
1146 Table 'shop.users' doesn't exist
Query:
SELECT * FROM users WHERE email = 'test@example.com'
Şu mesaj da kullanıcıya gösterilmemelidir:
Database connection failed:
Access denied for user 'root'@'localhost'
using password 'admin123'
Bu mesajlar saldırgana önemli bilgiler verebilir:
- Kullanılan veritabanı sistemi
- Tablo ve sütun isimleri
- Çalıştırılan SQL sorguları
- Veritabanı kullanıcı adı
- Sunucudaki dosya yolları
- Uygulamanın iç yapısı
- Kullanılan yazılım dili veya framework
Geliştirici için faydalı olan bu bilgiler, kötü niyetli biri için sistemin haritasına dönüşebilir.
Kullanıcının görmesi gereken mesaj daha sade olmalıdır:
İşleminiz sırasında bir hata oluştu.
Lütfen daha sonra tekrar deneyin.
Hata kodu: ERR-8F42A1
Hatanın gerçek ayrıntıları ise sunucudaki log kayıtlarında tutulmalıdır.
Böylece kullanıcı teknik detayları görmez. Geliştirici de ekranda gösterilen hata kodunu kullanarak loglardan sorunun kaynağını bulabilir.
Temel kural şudur: Kullanıcıya anlaşılır mesaj, geliştiriciye ayrıntılı log.
4. Her şeyi kopyalayıp yapıştırarak büyütmek
Projenin ilk sürümü hazırlanır. Daha sonra her yeni ihtiyaç için yapay zekâya yeni bir komut verilir:
- "Buraya ürün ekleme özelliği koy."
- "Şimdi bir de raporlama ekranı yap."
- "Aynısını müşteri paneline de ekle."
- "Bu sayfaya da yetkilendirme koy."
- "Bu kodu diğer sayfaya da uygula."
Her komutta yeni kod eklenir ancak kimse projenin tamamına bakmaz.
Bir süre sonra şu sorunlar ortaya çıkar:
- Aynı işi yapan birden fazla fonksiyon
- Birbirinden farklı isimlendirmeler
- Tek dosyada yüzlerce veya binlerce satır kod
- Tekrar eden veritabanı sorguları
- Test edilmemiş durumlar
- Bir yer düzeltilince başka bir yerin bozulması
- Yeni özellik eklemenin giderek zorlaşması
- Hangi kodun ne işe yaradığının anlaşılamaması
Buna teknik borç denir.
Teknik borç, bugün hızlı ilerlemek için yarının işini zorlaştırmaktır.
İlk gün fark edilmez. Çünkü sistem çalışıyordur. Ancak birkaç ay sonra küçük bir değişiklik bile saatlerce uğraştırmaya başlar.
Bu noktadan sonra projeyi geliştirmek yerine sürekli eski hataları düzeltmek zorunda kalırsınız.
5. Eski paketler ve yanlış yapılandırmalar kullanmak
Yapay zekâ bazen eğitim verilerindeki eski kod örneklerinden yararlanabilir.
Bu nedenle şunları önerebilir:
- Artık kullanılmayan bir kütüphane
- Güvenlik açığı bulunan eski bir paket
- Güncel sürümde çalışmayan bir ayar
- Eski Next.js, React, Laravel veya Node.js kullanımı
- Yalnızca geliştirme ortamında çalışan bir yapılandırma
- Production ortamında bulunmaması gereken varsayılan bir değer
- Güncel sürümde kaldırılmış bir fonksiyon
- Yanlış veya eksik environment variable kullanımı
Kod geliştiricinin bilgisayarında çalışabilir ancak sunucuya yüklendiğinde hata verebilir.
Çünkü lokal ortam ile gerçek sunucu ortamı aynı değildir.
Örneğin geliştiricinin bilgisayarında bulunan bir .env değeri sunucuda bulunmayabilir. AI da değer bulunamadığında otomatik olarak "secret" veya "localhost" gibi bir varsayılan değer kullanılmasını önerebilir.
Bu yaklaşım geliştirme ortamında sistemi çalıştırabilir ancak canlı ortamda güvenlik açığına veya bağlantı hatasına neden olabilir.
Gerçek bir projede paketlerin güncelliği, bilinen güvenlik açıkları, üretim ayarları ve ortam değişkenleri ayrıca kontrol edilmelidir.
6. Şifreleri yanlış şekilde saklamak
Bir başka önemli hata, kullanıcı şifrelerini veritabanında düz metin olarak tutmaktır.
Örneğin veritabanında şu şekilde kayıtlar bulunmamalıdır:
E-posta: kullanici@example.com
Şifre: kullanici123
Veritabanı bir şekilde ele geçirilirse bütün kullanıcıların şifreleri doğrudan ortaya çıkar.
Şifreler şifreleme yöntemiyle geri çözülebilecek şekilde değil, güvenli bir hash algoritması kullanılarak saklanmalıdır.
Burada önemli bir ayrım vardır:
- Şifreleme: Doğru anahtarla geri çözülebilir.
- Hash: Geri çözülmesi için tasarlanmamıştır.
Kullanıcı giriş yaptığında yazdığı şifrenin hash değeri kontrol edilir. Gerçek şifre veritabanında tutulmaz.
Ayrıca MD5 veya SHA-1 gibi eski ve hızlı algoritmalar parola saklamak için uygun değildir. Parolalar için bu işe özel olarak geliştirilmiş güvenli yöntemler kullanılmalıdır.
7. Yetkilendirme kontrolünü yalnızca ekranda yapmak
Bazen normal kullanıcıların görmemesi gereken bir buton frontend tarafında gizlenir ve bunun yeterli olduğu düşünülür.
Örneğin silme butonu yalnızca admin kullanıcısına gösterilir.
Ancak kötü niyetli biri butonu görmese bile ilgili API adresine doğrudan istek gönderebilir.
Yani şu yaklaşım yeterli değildir:
Kullanıcı admin değilse silme butonunu gösterme.
Sunucu tarafında da şu kontrol yapılmalıdır:
Bu isteği gönderen kullanıcı gerçekten admin mi?
Güvenlik yalnızca ekranda görünen butonlarla sağlanmaz. Her kritik işlem sunucu tarafında ayrıca kontrol edilmelidir.
8. Kullanıcıdan gelen veriye doğrudan güvenmek
Formdan, URL'den veya API isteğinden gelen her veri kullanıcı tarafından değiştirilebilir.
Örneğin kullanıcıdan ürün fiyatı alınırken şu veri gelebilir:
100
Ancak kötü niyetli biri bu değeri şuna çevirebilir:
-500
Ya da sipariş formunda gönderilen ürün fiyatını kendi tarayıcısından değiştirebilir.
Bu nedenle kullanıcıdan gelen veriler:
- Beklenen türde mi?
- İzin verilen aralıkta mı?
- Zorunlu alanlar dolu mu?
- Kullanıcının bu işlemi yapma yetkisi var mı?
- Zararlı kod veya beklenmeyen karakter içeriyor mu?
diye kontrol edilmelidir.
Frontend doğrulaması kullanıcı deneyimi için faydalıdır. Ancak güvenlik için asıl kontrol sunucu tarafında yapılmalıdır.
Deneyimli bir geliştirici ne katar?
Yapay zekâ hız kazandırır. Geliştirici ise doğru kararların verilmesini sağlar.
AI hızlı üretir:
- Çalışan demo kod
- "Şimdilik böyle" çözümler
- Tek dosyada toplanmış yapılar
- Varsayılan kullanıcı adları ve şifreler
- İlk bakışta doğru görünen çözümler
- Kopyalanmış ve tekrar eden kodlar
- Yalnızca başarılı senaryoya göre hazırlanmış sistemler
Geliştirici kontrol eder:
- Kodun canlı ortam için hazır olup olmadığını
- Güvenlik kontrollerini
- Uzun vadeli mimariyi
- Kodun modüler ve bakımı kolay olmasını
- Şifrelerin güvenli şekilde hash'lenmesini
- Secret yönetimini ve anahtar rotasyonunu
- Kullanıcı rollerini ve yetkilendirmeyi
- Hata ve log yönetimini
- Testleri ve kod incelemesini
- Canlıya geçiş kontrol listesini
- Güncelleme ve bakım süreçlerini
- Yedekleme ve geri yükleme planını
- Sistemin performansını ve limitlerini
Kısacası yapay zekâ kod yazabilir. Ancak hangi kodun kullanılacağına, nasıl kullanılacağına ve nerede risk bulunduğuna karar vermek hâlâ uzmanlık gerektirir.
Bir yazılım firmasının görevi yalnızca kod yazmak değildir
Bir bilişim firması olarak bizim işimiz yalnızca ekrana birkaç sayfa koymak veya çalışan butonlar hazırlamak değildir.
Öncelikle işletmenin gerçek ihtiyacını anlamamız gerekir.
Daha sonra:
- Doğru teknolojiyi seçeriz
- Projenin mimarisini planlarız
- Yapay zekâ çıktısını denetleriz
- Güvenlik kontrollerini yaparız
- Yetkilendirme sistemini kurarız
- Performansı test ederiz
- Sistemi canlı ortama uygun şekilde hazırlarız
- Hata kayıtlarını oluştururuz
- Yedekleme süreçlerini planlarız
- Canlıya geçtikten sonra güncelleme ve bakım yaparız
AI bu süreçlerin çoğunda kullanılabilir ve kullanılmalıdır.
Ancak kontrol yapay zekâda değil, ne yaptığını bilen geliştiricide olmalıdır.
Altın kural basittir: AI'ı sonuna kadar kullanın ama kontrolü ona bırakmayın.
Yapay zekâ devrimi artık geri alınamayacak bir noktaya geldi ve gelişmeye devam ediyor.
Bu değişimin büyük faydaları olacak. Yazılımlar daha hızlı geliştirilecek, fikirler daha kısa sürede ürüne dönüşecek ve küçük işletmeler teknolojiye daha kolay ulaşacak.
Ancak yazılım bilgisini tamamen atlayarak ilerleyenler için bunun bir bedeli de olacak:
- Güvenlik açıkları
- Veri sızıntıları
- Kolayca ele geçirilen yönetici panelleri
- Güncellenemeyen projeler
- "Kimse dokunmasın, sistem bozulur" denilen yazılımlar
- Küçük bir değişiklik için baştan yazılması gereken sistemler
- Birkaç ay sonra geliştiricisinin bile anlamadığı kodlar
Verar Soft olarak tam bu noktada devreye giriyoruz.
İşletmeniz için bir web sitesi, mobil uygulama, yönetim paneli veya özel yazılım düşünüyorsanız yalnızca çalışan bir sistem değil; güvenli, sürdürülebilir ve geliştirilebilir bir yapı kuruyoruz.
Mevcut sisteminizi güvenlik açısından inceletmek veya yeni projenizi birlikte değerlendirmek için İletişim sayfamız üzerinden bize ulaşabilirsiniz.
← Blog sayfasına dön