Türkiye'de ilk Mobil & PC Aynı Anda Metin2 Oyna. Triarchonline kalıcı ve uzun ömürlü yapısı ile 24 Temmuz'da açılıyor. | 1-99 Mobil Metin2 Triarch HEMEN TIKLA!
[NODE JS] Helmet ile HTTP Header Güvenliği
Selam arkadaşlar, bu konuda Express uygulamalarının güvenliğini artırmak için kullanılan Helmet paketini anlatacağım. Helmet tek bir satırla bir sürü güvenlik header'ı ekler ve uygulamanızı birçok yaygın saldırıya karşı korur. Ben her Express projeme ilk eklediğim paket Helmet'tır, o kadar önemli.
HTTP header'ları tarayıcıya nasıl davranması gerektiğini söyler. Mesela "bu sayfada inline script çalıştırma" veya "bu sayfayı iframe içinde gösterme" gibi talimatlar verebilirsiniz. Helmet bu header'ları otomatik olarak ayarlar.
Helmet olmadan Express uygulamanız X-Powered-By: Express header'ı gönderir. Bu saldırgana hangi framework'ü kullandığınızı söyler ve o framework'e özel açıkları denemesini kolaylaştırır. Helmet bunu kaldırır ve yerine koruyucu header'lar ekler.
Kurulum çok basit: npm install helmet. Bir satır middleware ekleyince 11 farklı güvenlik header'ı aktif olur. Ama her birinin ne yaptığını bilmeniz önemli çünkü bazılarını projenize göre özelleştirmeniz gerekebilir.
Temel Kullanım ve Tüm Header'lar
JavaScript:
const express = require('express');
const helmet = require('helmet');
const app = express();
// En basit kullanim - tum default'lar aktif
app.use(helmet());
// Veya tek tek ayarlamak isterseniz:
app.use(helmet({
// Content-Security-Policy: Script, style, image kaynaklarini sinirla
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", "https://cdn.jsdelivr.net"],
styleSrc: ["'self'", "'unsafe-inline'", "https://fonts.googleapis.com"],
imgSrc: ["'self'", "data:", "https:"],
fontSrc: ["'self'", "https://fonts.gstatic.com"],
connectSrc: ["'self'", "https://api.example.com"],
frameSrc: ["'none'"],
objectSrc: ["'none'"],
upgradeInsecureRequests: []
}
},
// X-DNS-Prefetch-Control: DNS prefetch'i kontrol et
dnsPrefetchControl: { allow: false },
// X-Frame-Options: Clickjacking'e karsi iframe engelle
frameguard: { action: 'deny' }, // veya 'sameorigin'
// Strict-Transport-Security: HTTPS zorla
hsts: {
maxAge: 31536000, // 1 yil
includeSubDomains: true,
preload: true
},
// X-Content-Type-Options: MIME sniffing engelle
noSniff: true,
// X-Permitted-Cross-Domain-Policies: Flash/PDF cross-domain engelle
permittedCrossDomainPolicies: { permittedPolicies: 'none' },
// Referrer-Policy: Referrer bilgisini sinirla
referrerPolicy: { policy: 'strict-origin-when-cross-origin' },
// X-XSS-Protection: Tarayici XSS filtresini aktif et
xssFilter: true,
// X-Download-Options: IE'de dosya indirme guvenligi
ieNoOpen: true,
// X-Powered-By: Framework bilgisini gizle (otomatik)
hidePoweredBy: true
}));
// Belirli route'lar icin farkli CSP
app.get('/admin',
helmet.contentSecurityPolicy({
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'"], // Admin panelde dis script yok
styleSrc: ["'self'"]
}
}),
(req, res) => {
res.send('Admin panel');
}
);
app.get('/', (req, res) => {
res.send('Guvenli uygulama');
});
app.listen(3000, () => {
console.log('Sunucu 3000 portunda calisiyor');
});
Helmet'ın eklediği her header'ın bir amacı var. Content-Security-Policy en güçlü olanı, hangi kaynaklardan script, style, image yüklenebileceğini belirler. X-Frame-Options clickjacking saldırısına karşı korur, sitenizin iframe içinde açılmasını engeller. HSTS ise tarayıcıya bu siteye sadece HTTPS ile bağlanmasını söyler. noSniff ise tarayıcının dosya tipini tahmin etmesini engeller, mesela bir text dosyasının script olarak çalıştırılmasını önler.
CSP Report ile İhlal Tespiti
JavaScript:
const express = require('express');
const helmet = require('helmet');
const app = express();
app.use(express.json({ type: 'application/csp-report' }));
// CSP ihlallerini raporla
app.use(helmet.contentSecurityPolicy({
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'"],
reportUri: '/csp-ihlal-rapor' // Ihlaller buraya raporlanir
}
}));
// CSP ihlal raporlarini topla
app.post('/csp-ihlal-rapor', (req, res) => {
const rapor = req.body['csp-report'];
if (rapor) {
console.log('CSP Ihlali:', {
engellenenUri: rapor['blocked-uri'],
ihlalEdilen: rapor['violated-directive'],
sayfa: rapor['document-uri'],
tarih: new Date().toISOString()
});
// Loglama servisine gonder
}
res.status(204).end();
});
app.listen(3000);
Pratik Tavsiyeler
Helmet kullanırken en çok sorun yaşanan konu CSP ayarlarıdır. Eğer CDN'den jQuery, Bootstrap gibi kütüphaneler yüklüyorsanız bunların domain'lerini scriptSrc ve styleSrc'ye eklemeniz gerekir, yoksa tarayıcı bunları bloklar ve siteniz çalışmaz.
Geliştirme ortamında CSP çok sıkıntı çıkarabilir, özellikle hot-reload kullanan araçlarda. O yüzden development'ta CSP'yi gevşek tutun veya tamamen kapatın, ama production'da kesinlikle açık olsun. Ben genelde environment'a göre farklı helmet konfigürasyonu kullanırım.
Bir de şunu söyleyeyim: Helmet tek başına yeterli değil. Helmet sadece header seviyesinde koruma sağlar, uygulama seviyesindeki açıkları kapatmaz. SQL injection, broken authentication, insecure deserialization gibi sorunlar için ayrıca önlem almanız gerekir. Helmet'ı güvenlik zırhınızın ilk katmanı olarak düşünün.
Kolay gelsin!
Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 3
- Görüntüleme
- 61
- Cevaplar
- 3
- Görüntüleme
- 73
