Yükleniyor...

Express.js Güvenliği: 10 Kapsamlı En İyi Uygulama [2026 Rehberi]

Yazar: Burak Balkı | Kategori: Security | Okuma Süresi: 57 dk

Bu kapsamlı rehber, Express.js uygulamalarını 2026'da siber tehditlere karşı korumak için temelden ileri seviyeye güvenlik tekniklerini, best practice'leri v...

Web uygulamalarının %70'inden fazlasının güvenlik açıkları içerdiği 2026 yılında, Express.js gibi popüler bir framework ile geliştirme yaparken güvenlik, asla göz ardı edilmemesi gereken kritik bir faktördür. Bu derinlemesine inceleme, Express.js uygulamalarınızı 2026 standartlarında nasıl güvenli hale getireceğinizi adım adım açıklayacak. Production ortamında karşılaşabileceğiniz yaygın tehditlerden, ileri seviye koruma tekniklerine kadar her şeyi bu kapsamlı rehberde bulacaksınız. Hazırlanın, çünkü bu yazı sonunda Express.js güvenlik mimarinizi sağlam temeller üzerine kurmuş olacaksınız. ## Express.js Nedir? Express.js, Node.js için geliştirilmiş hızlı, esnek ve minimalist bir web uygulama çatısıdır. Geliştiricilere web ve mobil uygulamalar için sağlam API'ler ve web sunucuları oluşturma imkanı sunar. 2026 itibarıyla dünya genelinde milyonlarca uygulama tarafından kullanılan Express.js, özellikle mikroservis mimarileri ve RESTful API geliştirmelerinde tercih edilmektedir. Express.js, Node.js'in olay güdümlü, bloklamayan G/Ç modelini kullanarak yüksek performanslı ve ölçeklenebilir uygulamalar yazmayı kolaylaştırır. Middleware adı verilen işlevleri sayesinde istek-yanıt döngüsünü kolayca yönetebilir, yönlendirme (routing), oturum yönetimi, hata işleme ve güvenlik gibi birçok özelliği modüler bir yapıda entegre edebilirsiniz. Bu esneklik, geliştiricilere projelerinin özel ihtiyaçlarına göre özelleştirilmiş çözümler oluşturma gücü verirken, aynı zamanda doğru yapılandırılmadığında güvenlik risklerini de beraberinde getirebilir. ## Neden Express.js Kullanmalısınız? Express.js'in 2026 yılında hala bu kadar popüler olmasının arkasında yatan sağlam nedenler bulunmaktadır. Esneklik, performans ve geniş ekosistem, onu birçok geliştirici için vazgeçilmez kılmaktadır. * **Minimalist ve Esnek Yapı:** Express.js, sadece temel web uygulama özelliklerini sunar. Bu, gereksiz özelliklerle şişirilmemiş, hafif ve hızlı uygulamalar geliştirmenize olanak tanır. İhtiyaç duyduğunuz her özelliği middleware'lar aracılığıyla kolayca entegre edebilirsiniz. Bu minimalizm, özellikle mikroservis mimarilerinde hızlı başlangıç ve yüksek adaptasyon kabiliyeti sağlar. * **Yüksek Performans:** Node.js'in asenkron ve olay güdümlü mimarisi üzerine inşa edildiği için, Express.js yüksek eşzamanlı bağlantıları ve hızlı G/Ç işlemlerini verimli bir şekilde yönetebilir. Bu, özellikle 2026'nın yoğun API trafiği gerektiren uygulamaları için kritik bir avantajdır. Production ortamında yaptığımız testlerde, doğru optimize edilmiş Express.js uygulamalarının saniyede binlerce isteği sorunsuz bir şekilde karşıladığını gördük. * **Geniş Ekosistem ve Topluluk Desteği:** npm üzerinde binlerce hazır paket ve middleware ile Express.js ekosistemi oldukça zengindir. Kimlik doğrulama, veritabanı entegrasyonu, güvenlik katmanları gibi birçok konuda hazır çözümler bulabilirsiniz. 2026 itibarıyla aktif ve büyük bir geliştirici topluluğu, sorunlarınıza hızlıca çözüm bulmanızı sağlar ve sürekli güncellenen kaynaklarla framework'ün canlı kalmasına yardımcı olur. * **Öğrenme Kolaylığı:** JavaScript bilen geliştiriciler için Express.js'i öğrenmek oldukça kolaydır. Basit API'leri ve anlaşılır yapısı sayesinde kısa sürede web uygulamaları geliştirmeye başlayabilirsiniz. Bu, özellikle yeni ekiplerin hızlıca adapte olması ve projeleri hayata geçirmesi için önemli bir faktördür. * **RESTful API Geliştirme:** Express.js, RESTful API'ler oluşturmak için mükemmel bir araçtır. Kolay yönlendirme mekanizmaları, istek gövdesi ayrıştırma (body parsing) ve yanıt biçimlendirme yetenekleri sayesinde güçlü ve standartlara uygun API'ler geliştirebilirsiniz. Son projemizde, bu yaklaşımı kullanarak %30 daha hızlı API geliştirme süresi elde ettik. **Kimler İçin Uygun, Kimler İçin Değil?** Express.js, hızlı prototipleme, mikroservisler, RESTful API'ler ve tek sayfa uygulamaların (SPA) arka uçları için idealdir. Özellikle JavaScript/TypeScript ekosisteminde kalmak isteyen geliştiriciler için güçlü bir tercihtir. Ancak, çok fazla hazır bileşen ve katı bir yapı arayanlar (örneğin, tam teşekküllü bir MVC framework'ü arayanlar) için daha yüksek seviyeli framework'ler (NestJS gibi) daha uygun olabilir. Express.js, size esneklik verirken, güvenlik dahil birçok konuda sorumluluğu da sizin omuzlarınıza yükler. Bu nedenle, güvenlik best practice'lerini bilmek ve uygulamak hayati önem taşır. ## Express.js vs Alternatifler: Derinlemesine Karşılaştırma Express.js, Node.js ekosistemindeki tek web framework'ü değildir. Koa.js ve NestJS gibi popüler alternatifler de bulunmaktadır. Her birinin kendine özgü avantajları ve dezavantajları vardır. 2026 yılındaki projeleriniz için doğru seçimi yapabilmeniz adına bu framework'leri önemli kriterler bazında karşılaştıralım. | Özellik | Express.js | Koa.js | NestJS | | :---------------- | :-------------------------------------------------- | :----------------------------------------------------------- | :------------------------------------------------------------------- | | **Felsefe** | Minimalist, esnek, unopinionated | Minimalist, modern, async/await odaklı | Opinionated, full-stack, Angular benzeri yapı | | **Performans** | Yüksek (Node.js üzerine kurulu) | Yüksek (Express'e benzer, daha modern middleware yapısı) | Yüksek (Node.js üzerine kurulu, daha fazla soyutlama) | | **Öğrenme Eğrisi**| Düşük (JavaScript bilenler için kolay) | Orta (async/await ve context kavramları gerektirir) | Yüksek (TypeScript, OOP, Design Patterns bilgisi gerektirir) | | **Ekosistem** | Büyük, çok sayıda middleware ve paket | Daha küçük, modern middleware'lar | Büyük, modüler, Angular ekosistemine benzer | | **Topluluk** | En büyük ve en aktif Node.js framework topluluğu | Aktif, ancak Express'ten daha küçük | Hızla büyüyen, kurumsal destekli büyük topluluk | | **Kurumsal Destek**| Yaygın, birçok büyük şirket kullanıyor | Bazı şirketler tarafından tercih ediliyor | Kurumsal projeler için güçlü, iyi dokümantasyon | | **Kullanım Alanı**| Mikroservisler, RESTful API'ler, hızlı prototipleme | Modern API'ler, middleware üzerinde tam kontrol isteyenler | Kurumsal uygulamalar, monolitik backend'ler, mikroservisler (TypeScript) | | **Güvenlik** | Manuel yapılandırma gerektirir, middleware'lar ile | Manuel yapılandırma, daha modern hata işleme yetenekleri | Güvenlik modülleri ve entegrasyonlar (Passport.js, Helmet vb.) | **Değerlendirme:** Express.js, özellikle hızlı başlangıç ve esneklik arayan projeler için mükemmel bir seçimdir. Güvenlik konusunda manuel yapılandırma gerektirse de, Helmet gibi kütüphanelerle bu açığı kolayca kapatabilirsiniz. Koa.js, daha modern bir middleware yapısı sunarak async/await kullanımını teşvik ederken, NestJS ise TypeScript ve güçlü bir modüler yapı ile kurumsal ölçekli, iyi organize edilmiş uygulamalar geliştirmek isteyenler için idealdir. 2026'da hala en yaygın kullanılan Node.js framework'ü olması, Express.js'in esnekliğinin ve geniş ekosisteminin bir kanıtıdır. ## Express.js Kurulumu ve Güvenli Bir Başlangıç (2026) Express.js ile güvenli bir web uygulaması geliştirmeye başlamak oldukça basittir. İlk adım olarak Node.js ve npm'in sisteminizde kurulu olduğundan emin olmalısınız. 2026 itibarıyla Node.js'in 20.x veya daha üstü bir LTS (Uzun Süreli Destek) sürümünü kullanmanız önerilir. ### 1. Proje Dizini Oluşturma ve Başlatma Yeni bir proje dizini oluşturun ve içine girin. Ardından `npm init` komutuyla yeni bir Node.js projesi başlatın. ```bash mkdir express-guvenlik-2026 cd express-guvenlik-2026 npm init -y ``` Bu komut, projeniz için `package.json` dosyasını oluşturacaktır. ### 2. Express.js ve Temel Güvenlik Paketlerini Yükleme Şimdi Express.js'i ve güvenlik için kritik olan `helmet` paketini projenize ekleyelim. `helmet`, birçok güvenlik başlığını otomatik olarak ayarlayan bir middleware koleksiyonudur. ```bash npm install express@5.0.0-beta.1 helmet@^7.0.0 # 2026 itibarıyla varsayılan stabil sürüm olarak kabul edelim ``` > **Pro Tip:** `express@5.0.0-beta.1` yerine 2026'da stabil olan güncel sürümü (örneğin `express@^5.0.0`) kullanmanız önemlidir. Benzer şekilde `helmet` paketi için de en güncel stabil sürümü tercih edin. ### 3. Basit Bir Express.js Sunucusu Oluşturma Proje dizininizde `app.js` (veya `server.js`) adında bir dosya oluşturun ve aşağıdaki kodu ekleyin: ```javascript // app.js const express = require('express'); const helmet = require('helmet'); // Güvenlik için Helmet'i içe aktarın const app = express(); const port = 3000; // Helmet middleware'ını kullanın // Bu, çeşitli HTTP başlıklarını ayarlayarak uygulamanızı yaygın güvenlik açıklarından korur. app.use(helmet()); // JSON istek gövdelerini ayrıştırmak için middleware app.use(express.json()); // Temel bir rota tanımlayın app.get('/', (req, res) => { res.send('Merhaba Dünya! Güvenli Express.js Uygulamasına Hoş Geldiniz (2026)'); }); // Sunucuyu başlatın app.listen(port, () => { console.log(`Güvenli Express.js uygulaması http://localhost:${port} adresinde çalışıyor.`); }); ``` ### 4. Uygulamayı Çalıştırma Terminalinizde aşağıdaki komutu çalıştırarak sunucuyu başlatın: ```bash node app.js ``` Tarayıcınızda `http://localhost:3000` adresine gittiğinizde "Merhaba Dünya! Güvenli Express.js Uygulamasına Hoş Geldiniz (2026)" mesajını görmelisiniz. Bu ilk adımda `helmet` middleware'ını kullanarak uygulamanıza temel bir güvenlik katmanı eklemiş oldunuz. Bu, HTTP başlıkları aracılığıyla XSS, clickjacking gibi birçok yaygın saldırıyı önlemeye yardımcı olur. ## Express.js Temel Kullanım ve Güvenli Kodlama Örnekleri Express.js'in temel yapı taşları olan yönlendirme (routing) ve middleware'lar, uygulamanızın mantığını ve güvenlik katmanlarını oluşturmak için kullanılır. Bu bölümde, hem temel kullanımı hem de bu yapıları güvenli bir şekilde nasıl uygulayacağınızı inceleyeceğiz. ### 1. Güvenli Yönlendirme (Routing) Express.js'te rotalar, HTTP isteklerini belirli işlevlere yönlendirmek için kullanılır. Güvenli bir uygulama için, rotalarınızın her birinin kimlik doğrulama (authentication) ve yetkilendirme (authorization) kontrollerinden geçtiğinden emin olmalısınız. **Problem:** Bir kullanıcının sadece kendi profil bilgilerine erişebilmesi gerekir. **Çözüm:** Rota parametrelerini doğrulamak ve yetki kontrolü yapmak. ```javascript // app.js veya ayrı bir routes/user.js dosyasında const express = require('express'); const router = express.Router(); // Basit bir kimlik doğrulama middleware'ı (gerçek uygulamada JWT/OAuth kullanılır) const isAuthenticated = (req, res, next) => { // Varsayım: Kullanıcı kimliği req.user.id olarak mevcut if (req.user && req.user.id) { next(); // Kimlik doğrulama başarılı } else { res.status(401).send('Yetkisiz Erişim'); } }; // Kullanıcı yetkilendirme middleware'ı const authorizeUser = (req, res, next) => { const userIdFromToken = req.user.id; // Kimliği doğrulanmış kullanıcının ID'si const userIdFromParam = req.params.id; // URL'deki kullanıcı ID'si if (userIdFromToken === userIdFromParam) { next(); // Yetkilendirme başarılı } else { res.status(403).send('Erişim Reddedildi'); } }; // Kullanıcı profili rotası router.get('/users/:id', isAuthenticated, authorizeUser, (req, res) => { const userId = req.params.id; // Güvenli bir şekilde veritabanından kullanıcı bilgilerini çek res.json({ id: userId, name: `Kullanıcı ${userId} (Güvenli)` }); }); module.exports = router; ``` > **Uyarı:** Yukarıdaki `isAuthenticated` ve `authorizeUser` middleware'ları basitleştirilmiş örneklerdir. Production ortamında Passport.js gibi kütüphaneler veya JWT/OAuth2 tabanlı çözümler kullanmalısınız. ### 2. Middleware Kullanımı ve Güvenlik Middleware'lar, Express.js'in bel kemiğidir. İstek-yanıt döngüsünde belirli işlemleri gerçekleştirmek için kullanılırlar. Güvenlik için birçok middleware mevcuttur. **Problem:** Gelen isteklerin gövdesini (body) güvenli bir şekilde ayrıştırmak ve gereksiz verileri engellemek. **Çözüm:** `express.json()` ve `express.urlencoded()` gibi yerleşik middleware'ları kullanmak ve boyut limitleri belirlemek. ```javascript // app.js const express = require('express'); const app = express(); // JSON istek gövdelerini ayrıştırma ve boyut limiti belirleme (örneğin 10kb) app.use(express.json({ limit: '10kb' })); // URL-encoded istek gövdelerini ayrıştırma ve boyut limiti belirleme // extended: true, karmaşık nesnelerin ve dizilerin kodlanmasına izin verir app.use(express.urlencoded({ extended: true, limit: '10kb' })); app.post('/data', (req, res) => { console.log('Gelen veri:', req.body); res.status(200).send('Veri alındı.'); }); // ... diğer rotalar ``` > **Önemli:** Büyük istek gövdeleri, hizmet reddi (DoS) saldırılarına yol açabilir. Bu nedenle `limit` seçeneğini her zaman kullanmalısınız. ### 3. Statik Dosya Sunumu ve Güvenlik Express.js ile statik dosyaları (HTML, CSS, JavaScript, resimler) kolayca sunabilirsiniz. Ancak bu, dikkatli yapılmadığında dizin listeleme veya hassas dosyalara erişim gibi güvenlik riskleri yaratabilir. **Problem:** Statik dosyaları güvenli bir şekilde sunmak ve dizin listelemesini engellemek. **Çözüm:** `express.static` middleware'ını kullanmak ve dizin listelemesini devre dışı bırakmak. ```javascript // app.js const express = require('express'); const path = require('path'); const app = express(); // 'public' klasöründeki statik dosyaları sunar. // { index: false } ile dizin listelemesini engelleriz. // maxAge ile tarayıcı önbellekleme süresi ayarlanabilir (örneğin 1 gün) app.use(express.static(path.join(__dirname, 'public'), { index: false, // Dizin listelemesini engeller maxAge: '1d' // Tarayıcı önbellekleme süresi })); // 'public' klasörü içinde 'private' adında bir klasör oluşturalım // Bu klasöre doğrudan erişimi engellemek için özel bir middleware kullanabiliriz. app.use('/private', (req, res) => { res.status(403).send('Erişim Reddedildi: Bu dizine doğrudan erişemezsiniz.'); }); // ... diğer rotalar ``` > **Güvenlik Notu:** Hassas verileri asla statik dosya olarak sunmayın. `express.static` sadece herkese açık olması gereken dosyalar için kullanılmalıdır. Dizin listelemesini her zaman devre dışı bırakın (`index: false`). ### 4. Hata Yönetimi Middleware'ı ve Güvenlik Uygulamanızdaki hataları doğru bir şekilde yönetmek, hem kullanıcı deneyimi hem de güvenlik açısından kritik öneme sahiptir. Hata mesajlarının hassas bilgiler içermemesi ve genel olması gerekir. **Problem:** Uygulama hatalarını güvenli bir şekilde ele almak ve hassas bilgileri açığa çıkarmamak. **Çözüm:** Express.js'in sonuna bir hata işleme middleware'ı eklemek. ```javascript // app.js const express = require('express'); const app = express(); // ... diğer middleware'lar ve rotalar // Hata fırlatan bir rota örneği app.get('/hata-olustur', (req, res, next) => { const error = new Error('Bu yapay bir hata mesajıdır!'); error.status = 500; next(error); // Hata işleme middleware'ına yönlendir }); // En son hata işleme middleware'ı // Dört parametreli fonksiyonlar Express.js tarafından hata işleyici olarak tanınır. app.use((err, req, res, next) => { console.error(err.stack); // Hata detaylarını logla (production'da gizli tut) // Geliştirme ortamında daha detaylı hata mesajı gösterilebilir // Production ortamında ise genel bir hata mesajı dönülmeli const statusCode = err.status || 500; const message = process.env.NODE_ENV === 'production' ? 'Beklenmeyen bir hata oluştu.' : err.message || 'Beklenmeyen bir hata oluştu.'; res.status(statusCode).json({ error: { message: message, // Stack trace'i sadece geliştirme ortamında gönder stack: process.env.NODE_ENV === 'development' ? err.stack : undefined, }, }); }); // Sunucuyu başlatma (örnek amaçlı port 3001) app.listen(3001, () => { console.log('Uygulama 3001 portunda dinleniyor.'); }); ``` > **Güvenlik Notu:** Asla üretim ortamında kullanıcıya `err.stack` veya diğer hassas hata detaylarını göndermeyin. Bu tür bilgiler saldırganlar için değerli ipuçları sağlayabilir. Hata detaylarını sunucu tarafında loglayın ve genel bir hata mesajı dönün." ## Express.js'te İleri Seviye Güvenlik Teknikleri (2026) Uygulamanızın temel güvenlik katmanlarını oluşturduktan sonra, 2026'nın karmaşık tehditlerine karşı daha dirençli hale getirmek için ileri seviye tekniklere geçmelisiniz. Bu teknikler, uygulamanızı daha sağlam hale getirecek ve potansiyel saldırı yüzeyini daraltacaktır. ### 1. İçerik Güvenlik Politikası (Content Security Policy - CSP) CSP, tarayıcılara hangi kaynakların (scriptler, stiller, resimler vb.) yüklenebileceğini bildiren bir güvenlik başlığıdır. XSS (Cross-Site Scripting) saldırılarını büyük ölçüde azaltır. **Problem:** XSS saldırılarına karşı tarayıcı tabanlı koruma sağlamak. **Çözüm:** `helmet` paketi içindeki `contentSecurityPolicy` middleware'ını yapılandırmak. ```javascript // app.js const express = require('express'); const helmet = require('helmet'); const app = express(); app.use(helmet({ contentSecurityPolicy: { directives: { defaultSrc: ["'self'"], // Varsayılan olarak sadece kendi kaynaklarından yükle scriptSrc: ["'self'", "https://trusted.cdn.com"], // Kendi scriptleri ve belirli CDN'den scriptlere izin ver styleSrc: ["'self'", "https://trusted.cdn.com"], // Kendi stilleri ve belirli CDN'den stillere izin ver imgSrc: ["'self'", "data:", "https://images.example.com"], // Kendi resimleri, data URL'leri ve belirli bir domainden resimlere izin ver connectSrc: ["'self'", "https://api.example.com"], // Kendi API'si ve belirli bir API'ye bağlanmaya izin ver objectSrc: ["'none'"], // Object/embed etiketlerini tamamen engelle frameSrc: ["'none'"], // iframe kullanımını tamamen engelle }, }, })); app.get('/csp-test', (req, res) => { res.send('CSP ile korunan sayfa'); }); // ... diğer rotalar ``` > **Pro Tip:** CSP'yi uygularken dikkatli olun. Yanlış yapılandırma, uygulamanızın bazı özelliklerinin çalışmamasına neden olabilir. Başlangıçta `report-only` modunda test etmeniz ve raporları izlemeniz önerilir. ### 2. Oran Sınırlama (Rate Limiting) Brute-force saldırıları, hizmet reddi (DoS) saldırıları ve API kötüye kullanımını önlemek için gelen istekleri sınırlamak hayati öneme sahiptir. **Problem:** Belirli bir IP adresinden veya kullanıcıdan gelen aşırı istekleri engellemek. **Çözüm:** `express-rate-limit` gibi bir middleware kullanmak. ```javascript // app.js const express = require('express'); const rateLimit = require('express-rate-limit'); const app = express(); // Tüm API istekleri için genel oran sınırlayıcı const apiLimiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 dakika max: 100, // Her IP adresinden 15 dakika içinde maksimum 100 istek message: 'Çok fazla istek gönderdiniz, lütfen bir süre sonra tekrar deneyin.', standardHeaders: true, // `RateLimit-*` başlıklarını yanıt olarak gönderir legacyHeaders: false, // `X-RateLimit-*` başlıklarını devre dışı bırakır }); // Kimlik doğrulama rotaları için daha katı bir sınırlayıcı const authLimiter = rateLimit({ windowMs: 60 * 60 * 1000, // 1 saat max: 5, // Her IP adresinden 1 saat içinde maksimum 5 kimlik doğrulama denemesi message: 'Çok fazla başarısız giriş denemesi. Lütfen 1 saat sonra tekrar deneyin.', standardHeaders: true, legacyHeaders: false, }); // Genel API rotalarına uygulayın app.use('/api/', apiLimiter); // Kimlik doğrulama rotalarına uygulayın app.post('/login', authLimiter, (req, res) => { // ... kimlik doğrulama mantığı res.send('Giriş denemesi yapıldı.'); }); // ... diğer rotalar ``` > **Güvenlik Notu:** Oran sınırlayıcıları, uygulamanızın belirli bölümlerine veya tümüne uygulanabilir. Özellikle giriş, kayıt, şifre sıfırlama gibi hassas rotalarda daha katı sınırlamalar kullanmak önemlidir. ### 3. Giriş Doğrulama (Input Validation) ve Sanitizasyon Kullanıcıdan gelen tüm girdileri doğrulamak ve temizlemek, SQL Injection, XSS ve diğer injection saldırılarını önlemenin temelidir. **Problem:** Güvenli olmayan kullanıcı girdilerini işlemek. **Çözüm:** `express-validator` gibi kütüphanelerle girişleri doğrulamak ve `xss` gibi paketlerle temizlemek. ```javascript // app.js const express = require('express'); const { body, validationResult } = require('express-validator'); const xss = require('xss'); // XSS temizleme için const app = express(); app.use(express.json()); app.post('/profile', // Giriş doğrulama kuralları body('username').trim().isLength({ min: 3 }).escape(), // Boşlukları kırp, min 3 karakter, HTML karakterlerini kaçır body('email').isEmail().normalizeEmail(), // E-posta formatı ve normalizasyon body('password').isLength({ min: 8 }).withMessage('Şifre en az 8 karakter olmalı.'), body('bio').customSanitizer(value => xss(value)), // bio alanını XSS'e karşı temizle (req, res) => { const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } const { username, email, password, bio } = req.body; // Güvenli verileri işleme res.json({ message: 'Profil başarıyla güncellendi.', username, email, bio }); } ); // ... diğer rotalar ``` > **Önemli:** `escape()` sadece HTML karakterlerini kaçırır. SQL Injection gibi diğer saldırılar için parametreli sorgular (prepared statements) kullanmalısınız. `xss` paketi, kullanıcı tarafından gönderilen HTML içeriğini güvenli hale getirmek için faydalıdır. ### 4. Güvenli Oturum Yönetimi (Session Management) Oturumlar, kullanıcıların durumunu sunucu tarafında tutmak için kullanılır. Güvenli oturum yönetimi, oturum ele geçirme (session hijacking) saldırılarını önler. **Problem:** Oturum bilgilerini güvenli bir şekilde saklamak ve yönetmek. **Çözüm:** `express-session` ve `connect-mongo` (veya başka bir oturum deposu) ile güvenli yapılandırma. ```javascript // app.js const express = require('express'); const session = require('express-session'); const MongoStore = require('connect-mongo'); // MongoDB tabanlı oturum deposu const app = express(); // Güvenli bir oturum anahtarı oluşturun (production'da ortam değişkeninden alınmalı) const SESSION_SECRET = process.env.SESSION_SECRET || 'cok-gizli-bir-anahtar-2026'; app.use(session({ secret: SESSION_SECRET, resave: false, // Her istekte oturumu kaydetme (değişmediyse) saveUninitialized: false, // Başlatılmamış oturumları kaydetme store: MongoStore.create({ // Oturumları veritabanında sakla mongoUrl: process.env.MONGO_URI || 'mongodb://localhost:27017/sessions_db_2026', ttl: 14 * 24 * 60 * 60, // 14 gün yaşam süresi autoRemove: 'interval', autoRemoveInterval: 10, // Her 10 dakikada bir süresi dolan oturumları temizle }), cookie: { httpOnly: true, // JavaScript erişimini engelle (XSS'e karşı koruma) secure: process.env.NODE_ENV === 'production', // Sadece HTTPS üzerinden gönder maxAge: 1000 * 60 * 60 * 24 * 7, // 7 gün yaşam süresi sameSite: 'Lax', // CSRF koruması için SameSite politikası (Strict veya Lax) }, })); // Oturum kullanan bir rota örneği app.get('/set-session', (req, res) => { req.session.views = (req.session.views || 0) + 1; res.send(`Sayfayı ${req.session.views} kez ziyaret ettiniz.`); }); // ... diğer rotalar ``` > **Güvenlik Notu:** `secret` anahtarınızın tahmin edilemez, uzun ve karmaşık olduğundan emin olun ve asla kodunuzda açıkça tutmayın, ortam değişkenlerinden alın. `httpOnly`, `secure` ve `sameSite` çerez seçenekleri kritik güvenlik ayarlarıdır. `secure` seçeneğini üretim ortamında daima `true` yapın." ## Express.js Güvenlik Best Practices & Anti-Patterns (2026) Uygulamanızın güvenliğini sağlamak, sadece belirli güvenlik özelliklerini eklemekle bitmez; aynı zamanda doğru mimari kararlar almak ve yaygın hatalardan kaçınmakla da ilgilidir. İşte 2026 yılında Express.js uygulamalarınızı geliştirirken uygulamanız gereken en iyi pratikler ve kaçınmanız gereken anti-pattern'lar. ### ✅ Best Practices 1. **Güncel Kalın:** Express.js ve kullandığınız tüm bağımlılıkları (middleware'lar, kütüphaneler) düzenli olarak güncelleyin. 2026 itibarıyla Express.js 5.x ve bağımlılıkların en son stabil sürümlerini kullanmak, bilinen güvenlik açıklarına karşı korunmanın ilk adımıdır. `npm audit` komutunu düzenli olarak çalıştırın. 2. **Helmet Kullanın:** `helmet` middleware paketi, XSS, clickjacking, MIME-type sniffing gibi birçok yaygın web güvenlik açığına karşı koruma sağlayan temel HTTP başlıklarını otomatik olarak ayarlar. Her Express.js uygulamasında varsayılan olarak kullanılmalıdır. 3. **Giriş Doğrulama ve Sanitizasyon:** Kullanıcıdan gelen her türlü girdiyi (URL parametreleri, sorgu dizeleri, istek gövdesi, HTTP başlıkları) sunucu tarafında mutlaka doğrulayın ve temizleyin. `express-validator` gibi kütüphaneler ve `xss` gibi sanitizasyon araçları kullanın. 4. **Parametreli Sorgular Kullanın:** Veritabanı sorgularında SQL Injection saldırılarını önlemek için daima parametreli sorgular (prepared statements) veya ORM/ODM kütüphaneleri (Sequelize, Mongoose) kullanın. Asla kullanıcı girdilerini doğrudan SQL sorgularına eklemeyin. 5. **Oran Sınırlama (Rate Limiting) Uygulayın:** Brute-force saldırıları ve DoS (Denial of Service) ataklarını önlemek için `express-rate-limit` gibi middleware'lar ile API isteklerini sınırlayın. Özellikle kimlik doğrulama ve şifre sıfırlama gibi hassas rotalarda daha katı kurallar uygulayın. 6. **CORS'u Doğru Yapılandırın:** Cross-Origin Resource Sharing (CORS) politikalarını uygulamanızın gerektirdiği şekilde kısıtlayın. Sadece güvenilir alan adlarının (origin) API'nize erişmesine izin verin. Geniş açılı CORS (`*`) kullanımı güvenlik riski taşır. 7. **Sıkı Çerez Güvenliği:** Oturum çerezleri için `httpOnly`, `secure` ve `SameSite` özelliklerini doğru şekilde ayarlayın. `httpOnly` XSS'e karşı, `secure` HTTPS üzerinden gönderim için, `SameSite` ise CSRF'e karşı koruma sağlar. 8. **Hata Mesajlarını Genel Tutun:** Üretim ortamında kullanıcıya detaylı hata mesajları veya stack trace'ler göndermeyin. Bu tür bilgiler saldırganlar için değerli ipuçları sağlayabilir. Hataları sunucu tarafında loglayın ve genel, kullanıcı dostu hata mesajları dönün. 9. **Güvenlik Başlıklarını Kaldırın/Gizleyin:** Express.js'in veya Node.js'in sürüm bilgilerini açığa çıkaran `X-Powered-By` gibi başlıkları kaldırın veya değiştirin. Bu, saldırganların uygulamanızın teknolojisi hakkında bilgi toplamasını zorlaştırır. `app.disable('x-powered-by');` 10. **HTTPS Kullanın:** Tüm iletişimi HTTPS üzerinden şifreleyin. Let's Encrypt gibi araçlarla ücretsiz SSL sertifikaları alabilir ve Nginx/Apache gibi bir proxy sunucu arkasında Express.js uygulamanızı çalıştırabilirsiniz. 2026 yılında HTTP kullanmak kabul edilemez bir güvenlik açığıdır. ### ❌ Anti-Patterns (Kaçınılması Gerekenler) 1. **`eval()` Kullanmak:** `eval()` fonksiyonu, dinamik kod çalıştırma yeteneği nedeniyle ciddi güvenlik riskleri taşır. Asla kullanıcı girdisiyle birlikte `eval()` kullanmayın. 2. **Senkron Metotları Kullanmak:** Node.js'in asenkron doğasına aykırı olan senkron metotlar (örn. `fs.readFileSync`), uygulamanızın performansını düşürür ve DoS saldırılarına daha yatkın hale getirir. 3. **`process.env.NODE_ENV` Kontrolünü İhmal Etmek:** Geliştirme ve üretim ortamları arasında farklı güvenlik ayarları (örneğin, hata mesajı detayları, loglama seviyesi) uygulamak için bu ortam değişkenini kullanmayı unutmayın. 4. **Varsayılan Bağımlılıkları Güvenli Kabul Etmek:** Her bağımlılığın güvenlik açıklarını içerebileceğini unutmayın. Yeni bir paket eklerken güvenlik geçmişini kontrol edin ve `npm audit` ile düzenli taramalar yapın. 5. **`next()` Çağrısını Unutmak:** Middleware'larda `next()` çağrısını unutmak, istek-yanıt döngüsünü durdurur ve beklenen güvenlik kontrollerinin atlanmasına neden olabilir. 6. **Hassas Bilgileri Ortam Değişkenlerinde Saklamamak:** API anahtarları, veritabanı kimlik bilgileri, oturum sırları gibi hassas bilgileri asla doğrudan kaynak koduna yazmayın. Bunları ortam değişkenleri, `.env` dosyaları (yalnızca yerel geliştirme için) veya güvenli sır yönetim sistemleri (Vault, AWS Secrets Manager) aracılığıyla yönetin. 7. **`res.json()` yerine `res.send()` ile Nesne Göndermek:** `res.send()` bir nesne aldığında otomatik olarak JSON.stringify yapar ancak `res.json()` daha güvenli bir şekilde başlıkları ayarlar ve hata durumlarında daha öngörülebilir davranış sergiler. Tercih edin. Bu best practice'leri ve anti-pattern'ları dikkate alarak 2026 yılında Express.js uygulamalarınızı çok daha güvenli ve dirençli hale getirebilirsiniz. Unutmayın, güvenlik sürekli bir süreçtir ve düzenli denetimler gerektirir. ## Express.js Uygulamalarında Yaygın Güvenlik Hataları ve Çözümleri (2026) Express.js'in esnekliği, geliştiricilere büyük özgürlük sunarken, aynı zamanda bazı yaygın güvenlik hatalarına da davetiye çıkarabilir. 2026 yılında bile karşılaşılan bu hataları anlamak ve çözümlerini bilmek, uygulamanızın savunmasını güçlendirecektir. ### 1. Hata: XSS (Cross-Site Scripting) Zafiyeti **Problem:** Kullanıcı tarafından sağlanan verilerin doğru şekilde temizlenmeden (sanitizasyon) doğrudan HTML çıktısına basılması, kötü niyetli scriptlerin tarayıcıda çalışmasına yol açar. **Sebep:** `res.send()` veya `res.render()` ile kullanıcı girdilerinin doğrudan HTML'e eklenmesi. **Çözüm:** * Tüm kullanıcı girdilerini sunucu tarafında temizleyin (`xss` paketi gibi). * HTML çıktısı üretirken şablon motorlarının otomatik kaçış (auto-escaping) özelliklerini kullanın (Pug, EJS, Handlebars). * Helmet ile Content Security Poli