Sevdamsın 1
Sevdamsın
farkmt2official 1
farkmt2official
emirhanHCL 1
emirhanHCL
Scarlet 1
Scarlet
Best Studio 1
Best Studio
mannaxxx 1
mannaxxx
Agora Metin2 1
Agora Metin2
Hikaye Ekle

[NODE JS] Helmet ile HTTP Header Güvenliği

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!

nodejs.png


[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)

Geri
Üst