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!