Ana Karargâh Neler Yapıyoruz?
Hikayemizin Perde Arkası Beyin Kıvılcımları Bağlantıya Geçin

CSP Nonce ile Dinamik İnline Script Güvenliği

Merhaba değerli okuyucular! Bugün, web güvenliğinin önemli bir bileşeni olan Content Security Policy (CSP) ve özellikle CSP nonce kullanarak dinamik inline scriptlerin nasıl güvenli bir şekilde yönetilebileceğini derinlemesine inceleyeceğiz. Bu tekniğin nasıl uygulanacağını ve neden önemli olduğunu detaylıca ele alacağız. Hazırsanız, güvenli script yönetiminin inceliklerine dalalım!

Content Security Policy (CSP) Nedir?

CSP, web uygulamalarında güvenliği artırmak için kullanılan bir HTTP başlığıdır. Tarayıcıya hangi kaynaklardan içerik yüklenebileceğini söyler ve XSS (Cross-Site Scripting) gibi saldırılara karşı koruma sağlar.

Nonce Nedir ve Neden Önemlidir?

Nonce (Number used once), her istekte benzersiz olarak oluşturulan bir kriptografik rastgele sayıdır. CSP ile kullanıldığında, belirli inline scriptlerin çalışmasına izin vermek için kullanılır. Bu, dinamik olarak oluşturulan scriptlerin güvenli bir şekilde çalıştırılmasını sağlar.

CSP Nonce Nasıl Uygulanır?

1. Sunucu Tarafında Nonce Oluşturma


const crypto = require('crypto');

function generateNonce() {
    return crypto.randomBytes(16).toString('base64');
}

app.use((req, res, next) => {
    res.locals.nonce = generateNonce();
    next();
});

2. CSP Başlığını Ayarlama


app.use((req, res, next) => {
    const nonce = res.locals.nonce;
    res.setHeader('Content-Security-Policy', `script-src 'self' 'nonce-${nonce}'`);
    next();
});

3. HTML'de Nonce Kullanımı


<!-- EJS template örneği -->
<script nonce="<%= nonce %>">
    // Güvenli inline script
    console.log('Bu script güvenli!');
</script>

Dinamik Script Oluşturma ve Nonce Kullanımı

Dinamik olarak script oluşturuyorsanız, nonce'u bu scriptlere de eklemelisiniz:


function createDynamicScript(content, nonce) {
    const script = document.createElement('script');
    script.nonce = nonce;
    script.textContent = content;
    document.body.appendChild(script);
}

// Kullanım
createDynamicScript('console.log("Dinamik script");', '<%= nonce %>');

CSP Nonce Güvenlik Best Practices

1. Her İstek İçin Yeni Nonce

Her HTTP isteği için yeni bir nonce oluşturun. Asla nonce'ları yeniden kullanmayın.

2. Güçlü Rastgele Sayı Üreteci Kullanın

Nonce oluşturmak için kriptografik olarak güvenli rastgele sayı üreteci kullanın.

3. Nonce Uzunluğu

Nonce'un yeterince uzun olduğundan emin olun (en az 128 bit önerilir).

4. HTTPS Kullanın

CSP ve nonce'ları her zaman HTTPS üzerinden gönderin.

5. Diğer CSP Direktiflerini Unutmayın

script-src dışındaki diğer CSP direktiflerini de uygun şekilde yapılandırın.

CSP Nonce Yönetimi Sınıfı

Aşağıda, CSP nonce yönetimi için kullanabileceğiniz bir sınıf örneği bulunmaktadır:


const crypto = require('crypto');

class CSPNonceManager {
    constructor(options = {}) {
        this.nonceLength = options.nonceLength || 16;
        this.cspDirectives = options.cspDirectives || {
            'default-src': ["'self'"],
            'script-src': ["'self'"],
            'style-src': ["'self'"],
            'img-src': ["'self'"],
            'connect-src': ["'self'"]
        };
    }

    generateNonce() {
        return crypto.randomBytes(this.nonceLength).toString('base64');
    }

    buildCSPHeader(nonce) {
        let cspString = Object.entries(this.cspDirectives).map(([key, values]) => {
            if (key === 'script-src') {
                values = [...values, `'nonce-${nonce}'`];
            }
            return `${key} ${values.join(' ')}`;
        }).join('; ');

        return cspString;
    }

    middleware() {
        return (req, res, next) => {
            const nonce = this.generateNonce();
            res.locals.nonce = nonce;
            res.setHeader('Content-Security-Policy', this.buildCSPHeader(nonce));
            next();
        };
    }

    getNonceForRequest(req) {
        return req.res.locals.nonce;
    }
}

// Kullanım örneği
const cspManager = new CSPNonceManager({
    cspDirectives: {
        'default-src': ["'self'"],
        'script-src': ["'self'", 'https://trusted-cdn.com'],
        'style-src': ["'self'", 'https://trusted-cdn.com'],
        'img-src': ["'self'", 'https://img-cdn.com'],
        'connect-src': ["'self'", 'https://api.example.com']
    }
});

app.use(cspManager.middleware());

app.get('/', (req, res) => {
    const nonce = cspManager.getNonceForRequest(req);
    res.render('index', { nonce });
});

CSP Nonce Kullanımının Avantajları ve Dezavantajları

Avantajlar:

  • Dinamik inline scriptler için güvenli bir yol sağlar
  • XSS saldırılarına karşı güçlü koruma sunar
  • Scriptlerin kaynağını sıkı bir şekilde kontrol etmeyi sağlar

Dezavantajlar:

  • Her istek için ek işlem gerektirir (nonce oluşturma)
  • Önbelleğe alma stratejilerini karmaşıklaştırabilir
  • Eski tarayıcılarda tam destek olmayabilir

CSP nonce kullanımı, özellikle dinamik içerik üreten web uygulamaları için güvenliği önemli ölçüde artırır. XSS saldırılarına karşı güçlü bir savunma hattı oluşturur ve aynı zamanda gerektiğinde inline script kullanımına izin verir.

Ancak, CSP nonce'un tek başına yeterli olmadığını unutmayın. Güvenli kodlama pratikleri, input validasyonu, output encoding gibi diğer güvenlik önlemleriyle birlikte kullanılmalıdır.

Siz uygulamalarınızda CSP ve nonce kullanıyor musunuz? Karşılaştığınız zorluklar veya paylaşmak istediğiniz deneyimler var mı? Yorumlarınızı bekliyorum!

Güvenli kodlamalar ve güvenli scriptler dilerim!