Modern yazılım geliştirme süreçleri hiç olmadığı kadar hızlı. Bu hız, beraberinde yeni güvenlik açıkları ve kalitesiz kod risklerini de getiriyor. GitHub Copilot gibi yapay zeka destekli araçlar, geliştiricilere müthiş bir hız kazandırsa da, üretilen kodun güvenliğini ve kalitesini sağlamak kritik bir zorunluluk haline gelmiştir. Peki, Copilot’ı kullanarak daha güvenli ve sağlam kod değişiklikleri yapmanın tek ve etkili bir yolu var mı? İşte bu makale, tek bir akıllı prompt (istek) ile Copilot’tan bu yönde nasıl faydalanabileceğinizi adım adım açıklıyor.
Yazılım geliştirme dünyası, her geçen gün daha karmaşık hale geliyor. Sürekli artan özellik talepleri, hızlı teslimat beklentileri ve değişen teknoloji standartları, geliştiriciler üzerinde ciddi bir baskı oluşturuyor. Bu baskı altında, kod kalitesi ve güvenlik genellikle göz ardı edilebiliyor, bu da uzun vadede bakımı zor, hatalara açık ve potansiyel güvenlik riskleri barındıran uygulamalara yol açıyor. Yapay zeka destekli kodlama asistanları, özellikle GitHub Copilot, bu süreci hızlandırarak geliştiricilerin daha az eforla daha fazla kod üretmelerine olanak tanıyor. Ancak bu araçların “güvenli” kod ürettiğini varsaymak büyük bir yanılgı olabilir.
GitHub Copilot, geniş bir kod havuzu üzerinde eğitildiği için, genellikle “çalışan” ancak her zaman “en iyi” veya “en güvenli” çözümleri sunmayabilir. Bir fonksiyonun hızlıca tamamlanması harika bir zaman kazancı olsa da, bu fonksiyonun olası tüm senaryoları ele alıp almadığı, güvenlik açıklarına karşı dayanıklı olup olmadığı ya da performans açısından optimize edilip edilmediği gibi sorular cevapsız kalabilir. İşte bu noktada, geliştiricilerin devreye girmesi ve yapay zekayı doğru yönlendirmesi hayati önem taşıyor. Yapay zeka asistanını kullanarak, sadece kod üretmekle kalmayıp aynı zamanda proaktif bir yaklaşımla güvenlik, performans ve sürdürülebilirlik odaklı değişiklikler yapmak mümkündür. Doğru prompt mühendisliği ile Copilot, sadece bir kod yazarı olmaktan çıkıp, adeta bir “güvenlik ve kalite kontrol” ortağına dönüşebilir. Bu durum, özellikle büyük ve karmaşık projelerde, manuel kod incelemelerinin yükünü azaltarak geliştirme döngüsünü hızlandırabilir ve genel yazılım kalitesini artırabilir. Yazılım geliştirme sürecinin her aşamasında güvenlik ve kaliteyi bir öncelik haline getirmek, uzun vadede maliyetleri düşürür, müşteri memnuniyetini artırır ve markanın itibarını korur. Dolayısıyla, yapay zeka destekli geliştirme çağında, güvenli değişiklikler yapmak bir lüks değil, bir zorunluluktur.
Peki, bu zorunluluğu nasıl bir avantaja çevirebiliriz? Tek bir akıllı prompt ile Copilot’ı, sadece fonksiyonel değil, aynı zamanda güvenli, performanslı ve sürdürülebilir kod üretmeye nasıl teşvik edebiliriz? Bu sorunun cevabı, doğru bağlamı sağlamaktan, beklentileri net bir şekilde ifade etmekten ve olası riskleri önceden belirtmekten geçiyor. İlerleyen bölümlerde, bu tür bir prompt’u nasıl yapılandıracağımızı ve gerçek dünya senaryolarında nasıl uygulayacağımızı detaylıca inceleyeceğiz. Bu sayede, Copilot’ın sunduğu hızı, projenizin kalitesinden ödün vermeden güvenle kullanabilirsiniz.
Yapay Zeka Destekli Kodlama ve Güvenlik: Neden Önemli?
GitHub Copilot gibi yapay zeka destekli kodlama araçları, geliştiricilerin üretkenliğini artırma potansiyeliyle sektörde devrim yaratıyor. Temel olarak, bu araçlar, milyarlarca satır açık kaynak kod üzerinde eğitilmiş büyük dil modellerini (LLM) kullanarak, sizin yazdığınız kodu analiz eder ve bağlama uygun kod önerileri sunar. Bir fonksiyon imzası yazdığınızda, Copilot otomatik tamamlama ile fonksiyonun gövdesini oluşturabilir; bir yorum yazdığınızda, yorumun açıklamasına uygun kod parçacıkları önerebilir. Bu, özellikle tekrarlayan görevlerde veya yeni bir dil/API öğrenirken inanılmaz bir hız sağlar. Ancak bu hızın bir bedeli olabilir: üretilen kodun kalitesi ve güvenliği her zaman garanti altında değildir.
Bu bağlamda “agent prompt” terimi, yapay zekayı belirli bir görevi yerine getirirken nasıl yönlendireceğinizi ifade eder. Geliştirici olarak siz, bir “agent” gibi Copilot’ı belirli kurallar, kısıtlamalar ve hedefler doğrultusunda yönlendiren talimatlar (prompt’lar) sağlarsınız. Bu, Copilot’ın sadece en olası kodu değil, aynı zamanda sizin belirttiğiniz güvenlik, performans veya mimari standartlara uygun kodu üretmesini sağlar. Eğer Copilot’a sadece “şu işi yapan bir fonksiyon yaz” derseniz, muhtemelen işi yapan bir fonksiyon alırsınız. Ancak “bu fonksiyonu yazarken, SQL enjeksiyonlarına karşı koruma sağla, girdi validasyonunu dahil et, hata yönetimini loglama ile yap ve birim testleri için uygun bir yapı oluştur” derseniz, Copilot’tan çok daha kapsamlı ve güvenli bir sonuç bekleyebilirsiniz. Bu durum, yapay zekanın potansiyelini maksimize etmenin ve aynı zamanda olası riskleri minimize etmenin anahtarıdır.
Güvenli değişiklikler yapmanın önemi ise birden fazla boyutta ele alınabilir. İlk olarak, yazılım güvenliği, müşteri verilerinin korunması ve şirket itibarının sürdürülmesi açısından kritik öneme sahiptir. Bir güvenlik açığı, büyük veri ihlallerine, yasal sorunlara ve ciddi finansal kayıplara yol açabilir. İkinci olarak, kalitesiz kod, uygulamanın bakımı zorlaşmasına, yeni özelliklerin eklenmesinin yavaşlamasına ve hata ayıklama süreçlerinin uzamasına neden olur. Bu da geliştirme maliyetlerini artırır ve ürünün pazara çıkış süresini uzatır. Üçüncü olarak, performans sorunları, kullanıcı deneyimini olumsuz etkileyerek müşteri kaybına yol açabilir. Yapay zeka destekli kodlama araçları, doğru kullanılmadığında bu riskleri artırma potansiyeline sahiptir. Çünkü hızlı kod üretimi, gözden kaçabilecek hataların sayısını artırabilir. Bu nedenle, proaktif bir yaklaşımla, yani kod üretilirken güvenlik ve kalite faktörlerini göz önünde bulundurarak, bu riskleri baştan ele almak çok daha verimlidir. Bu yaklaşım, sadece mevcut sorunları çözmekle kalmaz, aynı zamanda gelecekteki potansiyel sorunları da önler. Dolayısıyla, yapay zeka destekli geliştirmenin etkinliği, sadece hızında değil, aynı zamanda sağladığı kodun güvenliği ve kalitesinde yatmaktadır. Bu sayede, geliştiriciler, hem daha hızlı hem de daha güvenilir çözümler üretebilirler.
Güvenli Değişiklikler İçin Tek Bir Copilot Prompt’u Nasıl Oluşturulur?
GitHub Copilot’tan en güvenli ve kaliteli sonuçları almak için, ona ne istediğinizi çok net ve kapsamlı bir şekilde anlatmanız gerekir. Bu, sadece “şunu yap” demekten öteye geçerek, “şunu yap, ama bu kısıtlamalarla, bu güvenlik önlemleriyle ve bu kalite standartlarına uygun olarak” demektir. Bu bölümde, tek bir güçlü prompt’u nasıl oluşturacağınızı adım adım inceleyeceğiz.
Prompt’un Bileşenleri: Yapı Taşlarını Anlamak
Etkili bir güvenlik odaklı prompt, çeşitli bileşenlerin dikkatli bir birleşimidir. İşte temel unsurlar:
- Bağlam Belirleme (Context Setting): Copilot’a, üzerinde çalıştığınız mevcut kod tabanı, projenin genel mimarisi, kullandığınız diller ve kütüphaneler hakkında bilgi verin. Örneğin, “Şu anki projem bir Node.js REST API’si ve MongoDB kullanıyor.” veya “Bir React bileşenine yeni bir özellik ekliyorum.” Bu, Copilot’ın daha alakalı öneriler sunmasına yardımcı olur.
- Hedef Tanımlama (Goal Definition): Yapmak istediğiniz değişikliği açıkça belirtin. “Yeni bir kullanıcı doğrulama endpoint’i oluşturmak istiyorum.” ya da “Mevcut bir ödeme işlevindeki hatayı düzeltmek istiyorum.” gibi ifadeler kullanın.
- Güvenlik Gereksinimleri (Security Requirements): Bu kısım en kritik olanıdır. Copilot’tan beklediğiniz tüm güvenlik kontrollerini listeleyin. Örnekler:
- “Tüm kullanıcı girdilerini sanitize et ve valide et (XSS, SQL enjeksiyonu önlemleri).”
- “Hassas verileri (şifreler, API anahtarları) hiçbir zaman doğrudan loglama.”
- “Kimlik doğrulama ve yetkilendirme kontrollerini doğru bir şekilde uygula (JWT doğrulama).”
- “Tüm API yanıtlarında hata mesajlarını genel tut, detaylı hata izlerini ifşa etme.”
- “Bağımlılık güncellemelerini kontrol et ve bilinen güvenlik açıklarını önle.”
- “Parola karma işlemleri için güvenli algoritmalar kullan (örneğin bcrypt).”
- Kalite ve Performans Kriterleri (Quality & Performance Criteria): Kodun sadece çalışması değil, aynı zamanda iyi yazılmış olması için beklentilerinizi belirtin.
- “Kod okunabilirliğini ve bakımını kolaylaştır.”
- “Performans açısından optimize edilmiş çözümler sun (örneğin döngü optimizasyonları, veritabanı sorgu optimizasyonları).”
- “Birim testleri veya entegrasyon testleri için uygun bir yapı önceliklendir.”
- “Hata yönetimi mekanizmalarını (try-catch, error handling middleware) dahil et.”
- “Kodu modüler tut, single responsibility prensibine uy.”
- Çıktı Formatı ve Ek Bilgiler (Output Format & Additional Info): Copilot’tan istediğiniz çıktının şeklini belirtin. Örneğin, “Sadece JavaScript kodu sun, ayrı bir açıklama bloğu ekleme.” veya “Önce kod, sonra kısa bir açıklama ve olası riskler listesi.”
Örnek Bir Tekil Güvenlik Odaklı Copilot Prompt’u
Şimdi yukarıdaki bileşenleri bir araya getirerek güçlü bir prompt oluşturalım. Bu prompt’u, yeni bir özellik geliştirirken veya mevcut bir kodu refaktör ederken kullanabilirsiniz.
"Mevcut Node.js/Express API projemizde yeni bir kullanıcı kayıt endpoint'i (/api/register) oluşturmam gerekiyor. Kullanıcıdan username, email ve password alacak.
Bu endpoint'i tasarlarken şu güvenlik, kalite ve performans gereksinimlerini kesinlikle gözet:
1. Girdi Validasyonu ve Temizliği: Tüm kullanıcı girdileri (özellikle email ve password) sunucu tarafında kapsamlı bir şekilde valide edilmeli ve XSS/SQL enjeksiyonu gibi yaygın saldırılara karşı temizlenmelidir. Email formatı kontrolü, parola karmaşıklığı (min. uzunluk, özel karakter vb.) zorunluluğu olmalıdır.
2. Parola Saklama: Parolalar asla düz metin olarak kaydedilmemeli, bcrypt gibi güçlü bir şifreleme algoritması ile hash'lenmelidir. Hashlenmiş parolaların güvenli bir şekilde depolanmasını sağla.
3. Hata Yönetimi ve Loglama: Herhangi bir hata durumunda (geçersiz girdi, veritabanı hatası vb.) kullanıcıya sadece genel hata mesajları dönmeli (örneğin, "Kayıt işlemi başarısız oldu"), sunucu iç detayları (stack trace) ifşa edilmemelidir. Hatalar güvenli bir şekilde sunucu tarafında loglanmalıdır.
4. Veritabanı İşlemleri: MongoDB'ye yeni kullanıcı kaydederken, mevcut bir kullanıcıyla (email veya username) çakışma kontrolü yapılmalıdır. İşlem atomik olmalı veya tutarlılığı garanti altına alacak şekilde tasarlanmalıdır.
5. Performans: Kayıt işlemi sırasında gereksiz pahalı işlemlerden kaçınılmalı, yanıt süresi optimize edilmelidir.
6. Kod Kalitesi: Kod okunabilir, modüler ve test edilebilir olmalıdır. Express middleware'ları kullanılarak mantık ayrımı sağlanabilir.
7. Yanıt Güvenliği: Başarılı kayıt sonrası dönülen yanıt nesnesi, hassas bilgileri (örneğin kullanıcının şifrelenmiş parolası) içermemelidir.
Bu gereksinimleri karşılayan, ilgili Express rotasını, veritabanı etkileşim mantığını (MongoDB için Mongoose varsayabiliriz) ve gerekli yardımcı fonksiyonları içeren bir JavaScript kodu örneği sun. Her bir güvenlik maddesine uygunluk için kod içinde kısa yorumlar ekle."
Bu prompt, Copilot'a sadece ne yapacağını değil, aynı zamanda nasıl yapacağını, hangi güvenlik standartlarına uyması gerektiğini ve hangi kalite beklentilerini karşılaması gerektiğini de açıkça belirtir. Bu sayede, Copilot'ın ürettiği ilk taslak bile çok daha güvenli ve sağlam olacaktır.
Unutmayın, Copilot bir araçtır ve en iyi sonuçları, onu en iyi şekilde kullandığınızda alırsınız. Bu tür detaylı ve yönlendirici prompt'lar, yapay zekayı sadece bir otomatik tamamlama motorundan, tam teşekküllü bir yardımcı mimar ve güvenlik danışmanına dönüştürebilir.
Vaka Analizi: Mevcut Bir Koda Güvenli Bir Özellik Ekleme
Bir web uygulamasına yeni bir kullanıcı profili resim yükleme özelliği eklediğimizi düşünelim. Bu tür bir işlem, dosya yükleme, depolama ve sunum güvenliği açısından birçok risk taşır. Güvenli değişiklikler için tekil prompt'umuzun bu senaryoda nasıl çalıştığını görelim.
Senaryo: Kullanıcı Profili Resmi Yükleme Özelliği
Mevcut bir Node.js/Express uygulamasına kullanıcıların profil resimlerini yükleyebileceği bir API endpoint'i eklemek istiyoruz. Başlangıçta, bu tür bir özellik genellikle hızlıca koda dökülür ve temel işlevselliğe odaklanılır. Ancak, dosya yüklemeleri, kötü niyetli yüklemeler (zararlı dosyalar, çok büyük dosyalar), dizin geçişi saldırıları ve kimlik doğrulama eksiklikleri gibi ciddi güvenlik riskleri barındırır.
Başlangıç Yaklaşımı (Güvenlik Önlemleri Eksik):
Öncelikle, güvenlik önlemleri dikkate alınmadan, sadece işlevselliği odak alan bir geliştiricinin nasıl bir kod yazabileceğine bakalım:
// app.js veya users.js
const express = require('express');
const router = express.Router();
const multer = require('multer'); // Dosya yükleme için basit bir kütüphane
const path = require('path');
// Yüklemeleri direkt "uploads" klasörüne kaydet
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'uploads/'); // !!! Güvenlik riski: Dosya türü veya boyutu kontrolü yok
},
filename: function (req, file, cb) {
cb(null, Date.now() + path.extname(file.originalname));
}
});
const upload = multer({ storage: storage });
router.post('/profile-upload', upload.single('profileImage'), (req, res) => {
if (!req.file) {
return res.status(400).send('Resim dosyası bulunamadı.');
}
// Burada kullanıcı ID'si alınıp veritabanına kaydedilir vs.
// Örneğin: User.findByIdAndUpdate(req.user.id, { profileImage: req.file.path });
res.status(200).send('Resim başarıyla yüklendi: ' + req.file.path);
});
module.exports = router;
Bu kod parçacığı, bir resim yükleme işlevselliğini temel düzeyde yerine getirir. Ancak aşağıdaki güvenlik açıklarını barındırır:
- Dosya Türü Kontrolü Yok: Kullanıcılar yürütülebilir dosyalar (.exe, .php vb.) yükleyebilir, bu da sunucu güvenliğini tehlikeye atar.
- Dosya Boyutu Kontrolü Yok: Çok büyük dosyalar yüklenerek sunucunun disk alanı doldurulabilir (DoS saldırısı).
- Yetkilendirme Eksikliği: Kimliği doğrulanmamış kullanıcılar veya başka bir kullanıcının profiline resim yüklemeye çalışan kötü niyetli kullanıcılar için kontrol yok.
- Dizin Geçişi/Dosya Kapsamı Açığı:
path.extnamekullanımı bir miktar koruma sağlasa da, daha sofistike saldırılarla dosya adını manipüle ederek farklı dizinlere yazma riski mevcut olabilir. - Depolama Güvenliği: Yüklenen dosyaların sunulduğu dizinin güvenliği ve erişim izinleri göz ardı edilmiştir.
Güvenli Değişiklikler Prompt'unu Uygulama
Şimdi, Copilot'a daha önce oluşturduğumuz güvenlik odaklı prompt'umuza benzer bir prompt'u vererek bu özelliği daha güvenli hale getirmesini isteyelim:
"Mevcut Node.js/Express API projemizde, kimliği doğrulanmış kullanıcıların profil resimlerini güvenli bir şekilde yükleyebileceği bir endpoint oluşturmam gerekiyor. Kullanıcı profileImage adında bir resim dosyası yükleyecek.
Bu endpoint'i tasarlarken şu güvenlik, kalite ve performans gereksinimlerini kesinlikle gözet:
1. Kimlik Doğrulama ve Yetkilendirme: Sadece kimliği doğrulanmış ve kendi profiline resim yüklemeye yetkili kullanıcılar bu endpoint'i kullanabilmelidir. JWT tabanlı kimlik doğrulama kullanıldığını varsay.
2. Dosya Tipi Validasyonu: Yalnızca belirli resim formatlarına (JPEG, PNG, GIF) izin verilmelidir. Diğer dosya türlerinin yüklenmesi kesinlikle engellenmelidir.
3. Dosya Boyutu Kısıtlaması: Yüklenen resim dosyası boyutu maksimum 2MB ile sınırlandırılmalıdır.
4. Dosya Adı Güvenliği: Yüklenen dosyaların adları benzersiz olmalı, kullanıcı tarafından sağlanan dosya adları temizlenmeli (sanitize) ve dizin geçişi gibi saldırıları önleyecek şekilde yeniden adlandırılmalıdır. Kullanıcı ID'si dosya adında kullanılabilir.
5. Depolama Yeri: Yüklenen dosyalar, herkese açık erişimi olmayan güvenli bir konumda depolanmalı (örn. storage/profile_images). Direkt statik sunumdan kaçınılmalı veya güvenli bir resim sunma mekanizması tasarlanmalıdır.
6. Hata Yönetimi ve Loglama: Yükleme işlemi sırasında oluşabilecek her türlü hata (boyut aşımı, tür hatası, disk hatası vb.) uygun HTTP durum kodları ile geri bildirilmeli ve sunucu tarafında detaylıca loglanmalıdır. Kullanıcıya genel hata mesajları dönmelidir.
7. Veritabanı Entegrasyonu: Yüklenen resmin yolu veya kimliği, ilgili kullanıcının veritabanı kaydında güncellenmelidir. Bu işlem atomik olmalı veya hata durumunda geri alınabilmelidir.
8. Resim Optimizasyonu (İsteğe Bağlı): Mümkünse, yüklenen resimler sunum için optimize edilebilir (boyutlandırma, sıkıştırma).
Bu gereksinimleri karşılayan, ilgili Express rotasını, multer konfigürasyonunu ve örnek veritabanı güncelleme mantığını içeren bir JavaScript kodu örneği sun. Her bir güvenlik maddesine uygunluk için kod içinde kısa yorumlar ekle."
Copilot'ın Geliştirilmiş Önerileri (Prompt Sonrası)
Bu detaylı prompt ile Copilot, çok daha güvenli ve sağlam bir çözüm önerecektir. İşte beklenen çıktıya yakın bir örnek:
const express = require('express');
const router = express.Router();
const multer = require('multer');
const path = require('path');
const fs = require('fs'); // Dosya işlemleri için
const User = require('../models/User'); // Kullanıcı modeliniz olduğunu varsayalım
const authenticateToken = require('../middleware/auth'); // JWT auth middleware
// Depolama alanı ayarları
const storageDir = path.join(__dirname, '../storage/profile_images');
// Depolama dizini yoksa oluştur
if (!fs.existsSync(storageDir)) {
fs.mkdirSync(storageDir, { recursive: true });
}
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, storageDir); // Güvenli, herkese açık olmayan depolama dizini
},
filename: function (req, file, cb) {
// Dosya adını benzersiz ve güvenli hale getir
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
const fileExtension = path.extname(file.originalname).toLowerCase();
// Kullanıcı ID'si ile dosya adını bağla
cb(null, user-${req.user.id}-${uniqueSuffix}${fileExtension});
}
});
// Dosya filtresi: Yalnızca resim dosyalarına izin ver
const fileFilter = (req, file, cb) => {
const allowedTypes = /jpeg|jpg|png|gif/;
const mimetype = allowedTypes.test(file.mimetype);
const extname = allowedTypes.test(path.extname(file.originalname).toLowerCase());
if (mimetype && extname) {
cb(null, true);
} else {
cb(new Error('Yalnızca JPEG, PNG veya GIF formatında resim dosyalarına izin verilmektedir.'), false);
}
};
// Multer konfigürasyonu
const upload = multer({
storage: storage,
limits: { fileSize: 2 * 1024 * 1024 }, // 2MB dosya boyutu limiti
fileFilter: fileFilter
}).single('profileImage');
// Profil resmi yükleme endpoint'i
router.post('/profile-upload', authenticateToken, (req, res) => {
upload(req, res, async (err) => {
// Hata yönetimi
if (err instanceof multer.MulterError) {
// Multer hataları (örn. dosya boyutu aşımı)
console.error('Multer hatası:', err.message); // Sunucu tarafında loglama
return res.status(400).send({ message: Yükleme hatası: ${err.message} });
} else if (err) {
// Diğer hatalar (örn. dosya tipi hatası)
console.error('Yükleme sırasında bilinmeyen bir hata oluştu:', err.message); // Sunucu tarafında loglama
return res.status(400).send({ message: 'Yükleme sırasında bir hata oluştu. Lütfen tekrar deneyin.' });
}
if (!req.file) {
return res.status(400).send({ message: 'Resim dosyası bulunamadı.' });
}
try {
// Veritabanı güncelleme: Kullanıcıya ait profileImage alanını güncelle
// req.user.id, authenticateToken middleware'ından geldiğini varsayıyoruz
const user = await User.findById(req.user.id);
if (!user) {
// Güvenlik: Kullanıcı bulunamazsa hata
// Daha önce yüklenmiş eski resmi silmek gerekebilir
fs.unlink(req.file.path, (unlinkErr) => {
if (unlinkErr) console.error('Eski resim silinirken hata:', unlinkErr);
});
return res.status(404).send({ message: 'Kullanıcı bulunamadı.' });
}
// Eski profil resmi varsa sil
if (user.profileImage && fs.existsSync(user.profileImage)) {
fs.unlink(user.profileImage, (unlinkErr) => {
if (unlinkErr) console.error('Eski profil resmi silinirken hata:', unlinkErr);
});
}
user.profileImage = req.file.path; // Yeni resmin yolunu kaydet
await user.save();
res.status(200).send({
message: 'Profil resmi başarıyla yüklendi.',
filePath: /api/users/${req.user.id}/profile-image // Güvenli sunum endpoint'i
});
} catch (dbError) {
console.error('Veritabanı güncelleme hatası:', dbError); // Sunucu tarafında loglama
// Hata durumunda yüklenen resmi sil
fs.unlink(req.file.path, (unlinkErr) => {
if (unlinkErr) console.error('Yüklenen resim silinirken hata:', unlinkErr);
});
res.status(500).send({ message: 'Profil resmi güncellenirken bir sorun oluştu.' });
}
});
});
// Güvenli profil resmi sunum endpoint'i (örnek)
router.get('/users/:userId/profile-image', async (req, res) => {
try {
const user = await User.findById(req.params.userId);
if (!user || !user.profileImage) {
return res.status(404).send({ message: 'Profil resmi bulunamadı.' });
}
// Güvenlik: Dosyanın depolama dizininde olduğundan emin ol
if (!user.profileImage.startsWith(storageDir)) {
console.error(Güvenlik Uyarısı: Kullanıcı ${req.params.userId} için geçersiz resim yolu: ${user.profileImage});
return res.status(400).send({ message: 'Geçersiz resim yolu.' });
}
res.sendFile(user.profileImage);
} catch (error) {
console.error('Profil resmi sunulurken hata:', error);
res.status(500).send({ message: 'Profil resmi sunulurken bir sorun oluştu.' });
}
});
module.exports = router;
Görüldüğü gibi, Copilot, verilen prompt doğrultusunda çok daha katmanlı bir çözüm sunmuştur:
authenticateTokenmiddleware'ı ile kimlik doğrulama zorunlu hale gelmiştir.fileFilterfonksiyonu ile dosya tipi kısıtlamaları (JPEG, PNG, GIF) getirilmiştir.limits: { fileSize: 2 * 1024 * 1024 }ile dosya boyutu sınırı konulmuştur.- Dosya adları
user-${req.user.id}-${uniqueSuffix}${fileExtension}şeklinde güvenli ve benzersiz hale getirilmiştir. - Hata yönetimi Multer hatalarını, dosya bulunamaması durumlarını ve veritabanı hatalarını kapsayacak şekilde genişletilmiştir.
- Yüklenen dosyaların herkese açık olmayan
storage/profile_imagesdizinine kaydedilmesi sağlanmış ve bu dizin yoksa oluşturulmuştur. - Veritabanı güncelleme işlemi sırasında önceki profil resminin silinmesi gibi bakım adımları da eklenmiştir.
- Resim sunumu için ayrı bir endpoint oluşturularak doğrudan dosya erişiminden kaçınılmış, bu da bir güvenlik katmanı daha eklemiştir.
Bu vaka analizi, tek bir kapsamlı prompt'un, yapay zekadan alınan çıktının kalitesini ve güvenliğini nasıl radikal bir şekilde artırabileceğini açıkça göstermektedir. Geliştiriciler, bu sayede hem zaman kazanır hem de potansiyel güvenlik açıklarını manuel olarak bulmaya çalışmak yerine, yapay zekayı bir önleyici araç olarak kullanır.
Vaka Analizi: Bir Hata Düzeltmesini Güvenli Hale Getirme
Mevcut bir sistemde, müşteri siparişlerini işleyen bir fonksiyonda kritik bir hata olduğunu varsayalım. Bu hata, bazen sipariş miktarının negatif olmasına veya stokta olmayan ürünlerin sipariş edilmesine neden oluyor. Bu tür bir hatanın düzeltilmesi, sadece işlevselliği düzeltmekle kalmamalı, aynı zamanda gelecekte benzer hataları önleyecek güvenlik ve tutarlılık kontrollerini de içermelidir.
Senaryo: Sipariş Miktarı Doğrulama Hatası
Bir e-ticaret uygulamasında, kullanıcıların sepetlerindeki ürünleri siparişe dönüştüren bir processOrder fonksiyonu bulunmaktadır. Fonksiyon, bazen hatalı girdi veya eşzamanlı istekler nedeniyle negatif miktarların geçmesine ya da stokta olmayan ürünlerin sipariş edilmesine izin veriyor. Bu, finansal kayıplara ve veri tutarsızlıklarına yol açmaktadır.
Başlangıçtaki Hatalı Fonksiyon (Güvenlik Önlemleri Eksik):
Aşağıdaki kod, hatanın var olduğu ve güvenlik/tutarlılık kontrollerinin yetersiz olduğu varsayılan bir senaryoyu temsil etmektedir:
// orderProcessor.js
async function processOrder(userId, cartItems) {
try {
const order = {
userId: userId,
items: [],
totalAmount: 0,
status: 'pending'
};
for (const item of cartItems) {
const product = await Product.findById(item.productId); // Product modelini varsayalım
if (!product) {
console.error(Ürün bulunamadı: ${item.productId});
continue; // Ürün bulunamazsa atla, hata fırlatma
}
// Basit miktar kontrolü, negatif kontrolü eksik
if (item.quantity > product.stock) {
// Stok yetersizse uyarı ver ama siparişi yine de işleyebilir
console.warn(Ürün ${product.name} için stok yetersiz!);
item.quantity = product.stock; // Miktarı stoka indirge
}
order.items.push({
productId: product._id,
name: product.name,
quantity: item.quantity,
price: product.price
});
order.totalAmount += item.quantity * product.price;
// Stoktan düşme işlemi - hata oluşursa geri alınmıyor
product.stock -= item.quantity;
await product.save();
}
const newOrder = new Order(order); // Order modelini varsayalım
await newOrder.save();
return { success: true, orderId: newOrder._id };
} catch (error) {
console.error('Sipariş işleme hatası:', error);
return { success: false, error: 'Sipariş işlenirken bir hata oluştu.' };
}
}
// Örnek kullanım (bir Express rotasından çağrıldığını varsayalım)
// router.post('/checkout', async (req, res) => {
// const { userId, cartItems } = req.body;
// const result = await processOrder(userId, cartItems);
// if (result.success) {
// res.status(200).send(result);
// } else {
// res.status(500).send(result);
// }
// });
Bu kod parçacığında temel hatalar ve güvenlik zafiyetleri şunlardır:
- Negatif Miktar Kontrolü Yok:
item.quantitydeğeri negatif olabilir, bu da stokta artışa neden olarak envanter tutarsızlığına yol açar. - Stok Kontrolü Yetersiz:
item.quantity > product.stockkontrolü, stok yetersizliğinde siparişi kısmen işlese de, kullanıcının beklentisini karşılamaz ve tutarsızlık yaratır. Kritik bir e-ticaret sisteminde bu, siparişin tamamen iptal edilmesi veya kullanıcının bilgilendirilmesi gereken bir durumdur. - İşlemsel Tutarlılık Eksikliği: Ürün stokundan düşme ve sipariş kaydetme işlemleri ayrı ayrı yürütülüyor. Eğer sipariş kaydedilemezse, ürün stokundan düşme işlemi geri alınmaz, bu da veri tutarsızlığına neden olur (işlem atomik değil).
- Hata Mesajı Yönetimi: Hata durumunda sadece genel bir mesaj dönülüyor, ancak bu hatanın neden kaynaklandığı (stok, geçersiz miktar) kullanıcıya daha spesifik olarak bildirilebilir.
- Eşzamanlılık Sorunları: Birden fazla kullanıcı aynı anda aynı ürünü sipariş etmeye çalıştığında race condition'lar oluşabilir ve stok kontrolü yetersiz kalabilir.
Güvenli Hata Düzeltmesi İçin Prompt Uygulaması
Şimdi, bu processOrder fonksiyonundaki hataları düzeltmek ve onu daha sağlam hale getirmek için Copilot'a bir prompt verelim:
"Mevcut Node.js e-ticaret projemizde, siparişleri işleyen processOrder(userId, cartItems) fonksiyonundaki kritik hataları düzeltmem gerekiyor. Fonksiyon, Product ve Order modellerini MongoDB ile kullanıyor.
Fonksiyonu yeniden düzenlerken şu güvenlik, kalite ve tutarlılık gereksinimlerini kesinlikle gözet:
1. Girdi Validasyonu: Her bir item.quantity pozitif bir tam sayı olmalı ve 0'dan büyük olmalıdır. Geçersiz miktarlar için hata fırlatılmalıdır.
2. Kapsamlı Stok Kontrolü: Sipariş verilmeden önce her bir ürün için yeterli stok olup olmadığı güvenli bir şekilde kontrol edilmelidir. Eğer herhangi bir ürünün stoğu yetersizse, tüm sipariş işlemi iptal edilmeli ve kullanıcıya hangi ürünün stokta olmadığı bilgisi dönülmelidir.
3. İşlemsel Atomiklik (Transaction): Ürün stoğunun düşürülmesi ve siparişin veritabanına kaydedilmesi işlemleri tek bir veritabanı işlemi (transaction) içinde yapılmalıdır. Bu sayede, herhangi bir adımda hata oluşursa tüm işlemler geri alınarak veri tutarlılığı sağlanmalıdır. MongoDB transaction'ları kullanabiliriz.
4. Eşzamanlılık Kontrolü: Birden fazla sipariş isteğinin aynı anda aynı ürünün stoğunu manipüle etmesini önlemek için uygun eşzamanlılık kontrol mekanizmaları (örn. pessimistic locking veya optimistic locking) düşünülmelidir. En azından, stok güncellenirken Product dokümanı kilitlenmelidir (örneğin findOneAndUpdate ile $inc operatörünün atomik kullanımı).
5. Hata Yönetimi ve Kullanıcı Bildirimi: Tüm hata durumları (geçersiz miktar, stok yetersizliği, veritabanı hataları vb.) için açık ve kullanıcı dostu hata mesajları döndürülmeli ve sunucu tarafında detaylıca loglanmalıdır.
6. Kod Kalitesi: Kod okunabilir, modüler ve performansı optimize edilmiş olmalıdır. Gereksiz veritabanı çağrılarından kaçınılmalıdır.
Bu gereksinimleri karşılayan, processOrder fonksiyonunun güncellenmiş bir JavaScript kodunu sun. MongoDB transaction'ları için Mongoose'un session kullanımını içerebilir. Her bir tutarlılık/güvenlik maddesine uygunluk için kod içinde kısa yorumlar ekle."
Copilot'ın Geliştirilmiş Çözümü (Prompt Sonrası)
Bu kapsamlı prompt ile Copilot, çok daha sağlam ve tutarlı bir processOrder fonksiyonu önerecektir:
const mongoose = require('mongoose');
const Product = require('../models/Product'); // Product modeliniz
const Order = require('../models/Order'); // Order modeliniz
async function processOrder(userId, cartItems) {
// Session (işlem) başlatma
const session = await mongoose.startSession();
session.startTransaction();
try {
const order = {
userId: userId,
items: [],
totalAmount: 0,
status: 'pending'
};
const productUpdates = []; // Stok güncellemelerini tutmak için
const productsInCart = new Map(); // Ürünleri önbelleğe almak için
// 1. Ürünleri al ve ilk kontrolleri yap
for (const item of cartItems) {
// Girdi Validasyonu: Miktar pozitif bir tam sayı olmalı
if (!Number.isInteger(item.quantity) || item.quantity <= 0) {
throw new Error(Geçersiz ürün miktarı: ${item.productId} için ${item.quantity}. Miktar pozitif bir tam sayı olmalıdır.);
}
const product = await Product.findById(item.productId).session(session);
if (!product) {
throw new Error(Ürün bulunamadı: ${item.productId});
}
// Kapsamlı Stok Kontrolü: Yetersiz stok durumunda tüm işlemi iptal et
if (item.quantity > product.stock) {
throw new Error(Ürün "${product.name}" için stok yetersiz. Mevcut stok: ${product.stock}, istenen: ${item.quantity}.);
}
productsInCart.set(product._id.toString(), product);
order.items.push({
productId: product._id,
name: product.name,
quantity: item.quantity,
price: product.price
});
order.totalAmount += item.quantity * product.price;
// Stok güncellemesi için productUpdates dizisine ekle
productUpdates.push({
productId: product._id,
quantity: item.quantity
});
}
// 2. Stokları güvenli bir şekilde düşür ve eşzamanlılık kontrolü yap
for (const update of productUpdates) {
const result = await Product.findOneAndUpdate(
{ _id: update.productId, stock: { $gte: update.quantity } }, // Optimistic Locking / Eşzamanlılık kontrolü
{ $inc: { stock: -update.quantity } },
{ new: true, session: session }
);
if (!result) {
// Eğer burada result null dönerse, başka bir işlem stoğu düşürmüş demektir.
throw new Error(Stok güncelleme hatası: Ürün ${update.productId} için yetersiz stok veya eşzamanlılık çakışması.);
}
}
// 3. Siparişi kaydet
const newOrder = new Order(order);
await newOrder.save({ session: session });
// İşlemi onayla
await session.commitTransaction();
session.endSession();
return { success: true, orderId: newOrder._id };
} catch (error) {
// Hata durumunda tüm işlemleri geri al
await session.abortTransaction();
session.endSession();
console.error('Sipariş işleme hatası:', error.message); // Sunucu tarafında detaylı loglama
return { success: false, error: error.message }; // Kullanıcıya detaylı ama güvenli hata mesajı
}
}
module.exports = processOrder;
// Örnek kullanım (bir Express rotasından çağrıldığını varsayalım)
/*
const processOrder = require('./orderProcessor');
router.post('/checkout', authenticateToken, async (req, res) => { // authenticateToken middleware'ı varsayalım
const { cartItems } = req.body;
try {
const result = await processOrder(req.user.id, cartItems);
if (result.success) {
res.status(200).send({ message: 'Siparişiniz başarıyla işlendi.', orderId: result.orderId });
} else {
// Hata mesajını doğrudan kullanıcıya dönebiliriz çünkü prompt'ta güvenli hata mesajları talep ettik
res.status(400).send({ message: result.error });
}
} catch (unexpectedError) {
console.error('Beklenmeyen hata:', unexpectedError);
res.status(500).send({ message: 'Sipariş işlenirken beklenmeyen bir hata oluştu.' });
}
});
*/
Bu revize edilmiş processOrder fonksiyonu, Copilot'ın prompt'umuza yanıt olarak getirdiği önemli iyileştirmeleri gösteriyor:
- Girdi Validasyonu: Miktar kontrolü ilk adımda yapılıyor ve negatif veya sıfır miktarlar için hata fırlatılıyor.
- Kapsamlı Stok Kontrolü: Tüm ürünlerin stok durumları sipariş işlemi başlamadan önce kontrol ediliyor ve yetersiz stok durumunda tüm işlem iptal ediliyor.
- MongoDB Transaction'ları:
session.startTransaction(),session.commitTransaction()vesession.abortTransaction()kullanarak ürün stoğu güncelleme ve sipariş kaydetme işlemleri atomik hale getirildi. Bu, herhangi bir adımda bir hata olması durumunda tüm değişikliklerin geri alınmasını sağlar, veri tutarlılığını garanti eder. - Eşzamanlılık Kontrolü:
Product.findOneAndUpdateiçindeki$gteoperatörü, stoğun güncel olduğundan ve yeterli olduğundan emin olmak için ek bir eşzamanlılık kontrolü sağlar. Eğer başka bir işlem stoğu düşürmüşse, bu işlem başarısız olur ve transaction geri alınır. - Hata Yönetimi: Hata mesajları daha spesifik ve kullanıcı dostu hale getirildi. Sunucu tarafında detaylı loglama yapılırken, kullanıcıya dönülen mesajlar bilgilendirici ancak iç detayları ifşa etmeyen bir yapıya sahip.
Bu vaka analizi, Copilot'ın doğru yönlendirmeyle sadece yeni kod üretmekle kalmayıp, aynı zamanda mevcut hataları düzelterek sistemin genel güvenliğini, tutarlılığını ve hata toleransını nasıl önemli ölçüde artırabileceğini ortaya koymaktadır. Bu, geliştiricilerin sadece işlevselliğe değil, aynı zamanda sistemin sağlamlığına odaklanmalarına olanak tanır.
Prompt'unuzu İleri Düzeyde Özelleştirme İpuçları
GitHub Copilot ile sadece temel prompt'larla yetinmek, aslında potansiyelinin büyük bir kısmını kullanmamak anlamına gelir. Deneyimli kullanıcılar ve geliştirme ekipleri, prompt'larını daha sofistike hale getirerek, AI'dan daha hassas, bağlamsal ve projenin özel ihtiyaçlarına uygun çıktılar alabilirler. İşte prompt'unuzu bir sonraki seviyeye taşıyacak bazı ileri düzey ipuçları:
1. Dinamik Prompt Üretimi ve Entegrasyonu
Her proje farklı kodlama standartlarına, linter kurallarına ve güvenlik politikalarına sahiptir. Prompt'unuzu her seferinde manuel olarak yazmak yerine, bu kuralları dinamik olarak prompt'a dahil edebilirsiniz. Örneğin:
- Linting Kuralları: Bir kod tabanındaki ESLint veya Prettier yapılandırmalarını özetleyen bir JSON veya metin dosyasını prompt'a ekleyebilirsiniz. "Şu anki projemiz ESLint kurallarını (airbnb config) takip ediyor, buna göre kodu formatla ve best practice'leri uygula."
- Güvenlik Politikaları: Şirketinizin genel güvenlik politikalarını (örn. "tüm API girdileri OAuth2 kapsam doğrulamasından geçmeli" veya "tüm veritabanı sorguları parametreleştirilmiş olmalı") prompt'a ekleyebilirsiniz.
- CI/CD Boru Hattı ile Entegrasyon: Belirli bir kod değişikliği CI/CD (Sürekli Entegrasyon/Sürekli Dağıtım) boru hattında bir adımı tetiklediğinde, Copilot'ın otomatik olarak bir güvenlik analizi veya test senaryosu önerisi oluşturmasını sağlayacak bir "meta-prompt" mekanizması düşünebilirsiniz. Örneğin, bir pull request açıldığında, Copilot, ilgili değişiklikler için otomatik olarak ek test senaryoları veya güvenlik inceleme maddeleri önerebilir.
2. Özel Copilot Ajanları veya Genişletilmiş Bağlam Kullanımı
GitHub Copilot'ın gelecekteki sürümleri veya mevcut genişletme mekanizmaları, projenize özel "ajanlar" tanımlamanıza izin verebilir. Ancak şimdilik, Copilot'a sağladığınız bağlamı genişleterek benzer bir etki yaratabilirsiniz:
- Örnek Kod Snippet'ları: Copilot'ın daha önce projenizde yazılmış, yüksek kaliteli ve güvenli kod örneklerinden öğrenmesini sağlayın. Prompt'unuza "Projemizde bu tür güvenlik mekanizmaları kullanıyoruz. Aşağıdaki örnek koda benzer bir yaklaşım sergile:" diyerek ilgili kod bloklarını ekleyebilirsiniz.
- Mimari Belgelerden Alıntılar: Projenizin mimari tasarım dokümanlarından ilgili bölümleri prompt'a ekleyerek, Copilot'ın daha büyük resme uygun çözümler önermesini sağlayabilirsiniz. Örneğin, "Mikroservis mimarimizin X ilkesine göre, bu yeni özellik bağımsız ve kendi veritabanı ile çalışmalıdır."
3. İteratif Prompting ve Çıktı Rafine Etme
Copilot'ın ilk çıktısı her zaman mükemmel olmayabilir. Bu normaldir. Önemli olan, çıktıyı değerlendirip, eksik veya hatalı bulduğunuz yerleri belirleyerek Copilot'a geri bildirim sağlamanızdır:
- Eksiklikleri Belirtin: "Bu kod X güvenlik kontrolünü atlamış, lütfen onu ekle."
- Alternatif İsteyin: "Bu yaklaşım yerine, daha performanslı veya daha az kaynak tüketen bir alternatif önerebilir misin?"
- Belirli Bir Kütüphane Kullanımı: "
jsonwebtokenyerinejosekütüphanesini kullanarak JWT doğrulamasını yeniden yaz."
4. Performans ve Kaynak Yönetimi Odaklı Prompt'lar
Güvenlik kadar performans da kritik bir faktördür. Prompt'larınıza performans odaklı yönergeler ekleyebilirsiniz:
- "Bu fonksiyonun bellek kullanımını minimize et."
- "Veritabanı sorgularını optimize et, N+1 probleminden kaçın."
- "Asenkron işlemleri verimli kullan, blocking I/O'dan kaçın."
- "Önbellekleme stratejileri (Redis Cache gibi) entegrasyonu için öneriler sun."
5. Mobil Uyumlu HTML ve CSS İçin Copilot'ı Kullanma
Madem ki bu makale mobil uyumlu HTML çıktısı talep ediyor, bu konuyu da Copilot ile nasıl ele alabileceğimize değinelim. Güvenli değişiklikler sadece backend veya uygulama kodunda değil, kullanıcı arayüzünde de önemlidir. Özellikle responsive tasarım, farklı ekran boyutlarında doğru görüntüleme ve etkileşim sağlayarak kullanıcı deneyimini güvenli hale getirir.
Aşağıda, bir web sayfasının mobil cihazlarda iyi görünmesini sağlayan temel bir CSS media query örneği bulunmaktadır. Copilot'tan bu tür kod bloklarını veya mevcut HTML/CSS kodunuzu responsive hale getirmesini isteyebilirsiniz:
/* Temel stiller (mobil öncelikli) */
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
box-sizing: border-box;
}
.container {
width: 100%;
padding: 15px;
}
/* Tablet ve daha büyük ekranlar için stiller */
@media screen and (min-width: 768px) {
.container {
width: 90%;
max-width: 960px;
margin: 0 auto;
padding: 20px;
}
nav ul {
display: flex;
justify-content: flex-end;
}
nav li {
margin-left: 20px;
}
}
/* Masaüstü ve daha büyük ekranlar için stiller */
@media screen and (min-width: 1024px) {
.container {
max-width: 1200px;
padding: 30px;
}
.sidebar {
float: left;
width: 25%;
}
.main-content {
float: right;
width: 70%;
}
}
Bu ipuçları, Copilot'ı sadece bir kod tamamlama aracı olarak değil, aynı zamanda akıllı bir kod ortağı, güvenlik denetçisi ve performans optimizasyon danışmanı olarak kullanmanıza olanak tanır. Kendi prompt stratejilerinizi geliştirerek, yapay zekadan en yüksek değeri elde edebilir ve yazılım geliştirme süreçlerinizin kalitesini önemli ölçüde artırabilirsiniz.
Yapay Zeka Destekli Geliştirmede Güvenliğin Geleceği
Yazılım dünyasının evrimi, yapay zeka destekli araçların yükselişiyle birlikte hız kesmeden devam ediyor. GitHub Copilot gibi araçlar, geliştirme süreçlerimizi dönüştürürken, "güvenli değişiklikler" kavramı da bu dönüşümün merkezine oturuyor. Bu makalede ele aldığımız tek ve kapsamlı prompt stratejisi, geliştiricilere sadece daha hızlı kod yazma imkanı sunmakla kalmıyor, aynı zamanda üretilen kodun kalitesini, güvenliğini ve sürdürülebilirliğini proaktif bir şekilde artırma gücü veriyor. Unutulmamalıdır ki, yapay zeka bir araçtır; onun etkinliği, onu kullanan kişinin yetkinliği ve onu yönlendirme biçimiyle doğrudan orantılıdır.
Doğru bağlam, net hedefler, ayrıntılı güvenlik gereksinimleri ve kalite kriterleri içeren bir prompt, Copilot'ı pasif bir kod önericisinden aktif bir güvenlik ortağına dönüştürebilir. Vaka analizlerimizle gördüğümüz gibi, bu yaklaşım hem yeni özellik eklerken hem de kritik hataları düzeltirken potansiyel riskleri baştan ele alarak, daha sağlam ve güvenilir yazılımlar ortaya çıkarmaktadır. Gelecekte, yapay zeka ajanları daha da akıllanacak, belki de projenin kod tabanını ve güvenlik politikalarını otomatik olarak analiz edip, size özel dinamik prompt'lar önerebileceklerdir. Ancak o zamana kadar, geliştiricilerin prompt mühendisliği becerilerini geliştirmeleri, bu araçlardan en iyi şekilde faydalanmanın anahtarı olacaktır.
Sonuç olarak, yapay zeka destekli geliştirme, geliştiricilerin omuzlarındaki yükü hafifletirken, onlara daha karmaşık sorunlara odaklanma ve daha stratejik kararlar alma fırsatı sunuyor. Güvenliğin, kod yazma sürecinin ayrılmaz bir parçası olarak görülmesi ve yapay zeka araçlarının bu amaca yönelik olarak kullanılması, hem bireysel projeler hem de tüm yazılım ekosistemi için daha aydınlık bir gelecek vaat ediyor. İnsan ve yapay zeka arasındaki bu iş birliği, sadece üretkenliği artırmakla kalmayacak, aynı zamanda yazılımın genel kalitesini ve güvenilirliğini de yeni zirvelere taşıyacaktır. Her zaman hatırlayın: en iyi kod, sadece çalışan kod değil, aynı zamanda güvenli, sürdürülebilir ve iyi tasarlanmış koddur.
Sıkça Sorulan Sorular
- Prompt'unuzu daha açık, daha spesifik ve daha basit adımlara bölerek yeniden formüle edin.
- Gerekirse, istenen güvenlik özelliğine dair bir örnek kod parçacığı sunarak Copilot'a rehberlik edin.
- İteratif bir yaklaşım benimseyerek, küçük adımlarla istediğiniz güvenlik seviyesine ulaşmaya çalışın.
- Copilot'ın çıktısını manuel olarak düzenleyin ve doğru yönde ilerlemesini sağlamak için ek yorumlar veya kodlar ekleyin.